remove cruft from Schwarzian transform section
This commit is contained in:
parent
6d3ad2f64d
commit
047ada4ef3
|
@ -1312,40 +1312,11 @@ I want to do a complicated sort: can you do a Schwartzian Transform in Python?
|
|||
|
||||
The technique, attributed to Randal Schwartz of the Perl community, sorts the
|
||||
elements of a list by a metric which maps each element to its "sort value". In
|
||||
Python, just use the ``key`` argument for the ``sort()`` method::
|
||||
Python, use the ``key`` argument for the :func:`sort()` function::
|
||||
|
||||
Isorted = L[:]
|
||||
Isorted.sort(key=lambda s: int(s[10:15]))
|
||||
|
||||
The ``key`` argument is new in Python 2.4, for older versions this kind of
|
||||
sorting is quite simple to do with list comprehensions. To sort a list of
|
||||
strings by their uppercase values::
|
||||
|
||||
tmp1 = [(x.upper(), x) for x in L] # Schwartzian transform
|
||||
tmp1.sort()
|
||||
Usorted = [x[1] for x in tmp1]
|
||||
|
||||
To sort by the integer value of a subfield extending from positions 10-15 in
|
||||
each string::
|
||||
|
||||
tmp2 = [(int(s[10:15]), s) for s in L] # Schwartzian transform
|
||||
tmp2.sort()
|
||||
Isorted = [x[1] for x in tmp2]
|
||||
|
||||
For versions prior to 3.0, Isorted may also be computed by ::
|
||||
|
||||
def intfield(s):
|
||||
return int(s[10:15])
|
||||
|
||||
def Icmp(s1, s2):
|
||||
return cmp(intfield(s1), intfield(s2))
|
||||
|
||||
Isorted = L[:]
|
||||
Isorted.sort(Icmp)
|
||||
|
||||
but since this method calls ``intfield()`` many times for each element of L, it
|
||||
is slower than the Schwartzian Transform.
|
||||
|
||||
|
||||
How can I sort one list by values from another list?
|
||||
----------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue