Schwartzian transform for tuple in list

Matt Nordhoff mnordhoff at
Wed Sep 24 23:46:33 CEST 2008

Chris Rebert wrote:
> On Wed, Sep 24, 2008 at 2:02 PM, David Di Biase <dave.dibiase at> wrote:
>> Hi,
>> I have a rather large list structure with tuples contained in them (it's
>> part of a specification I received) looks like so:
>> [(x1,y1,r1,d1),(x2,y2,r2,d2)...]
>> The list can range from about 800-1500 tuples in size and I'm currently
>> sorting it with this:
>> a_list.sort(lambda a, b: cmp(b[3], a[3]))
> You'd probably be better off using the 'key' keyword argument to
> .sort(), which is made for the Schwartzian Transform:
> a_list.sort(key=lambda x: x[3])
> This sorts the list items by the value produced by the key function
> for each item. It's also (IIRC) faster than using a comparison
> function like you're currently doing.
> Regards,
> Chris

Yes, using 'key' is faster than 'cmp'.

If you have Python 2.4 or newer, it would also be slightly faster to use
operator.itemgetter() instead of a lambda:

>>> import operator
>>> a_list.sort(key=operator.itemgetter(3))

>> I'm actually sorting it by the last value in the tuple (d2). I have been
>> researching more efficient sorting algorithms and came across Schwartzian
>> transform via these links:
>> I get what's happening (  but I'm not sure if it is more
>> efficient in my scenario, if it is then I have no idea how to implement it
>> properly :-/
>> Would be great if a true expert would offer a suggestion for me...
>> Thanks!
>> David

More information about the Python-list mailing list