Schwartzian Transform in python

By: Python Documentation Team Viewed: 153225 times  Printer Friendly Format    


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:

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.



Most Viewed Articles (in Python )

Latest Articles (in Python)

Comment on this tutorial