Sorting a List of Lists

Bruno Desthuilliers bruno.42.desthuilliers at wtf.websiteburo.oops.com
Wed Jan 31 07:35:39 EST 2007


apotheos at gmail.com a écrit :
> I can't seem to get this nailed down and I thought I'd toss it out 
> there as, by gosh, its got to be something simple I'm missing.
> 
> I have two different database tables of events that use different 
> schemas. I am using python to collate these records for display. I do 
> this by creating a list of lists that look roughly like this:
> 
> events = [['Event URL as String', 'Event Title as String ', Event Date 
> as Datetime], ...]

Then you should not use a list of lists, but a list of tuples.

> I then thought I'd just go events.sort(lambda x,y: x[2]<y[2]) and call 
> it a day. That didn't work. But then lamda functions like to be very 
> simple, maybe object subscripts aren't allowed (even though I didn't 
> get an error). So I wrote a comparison function that looks much as you 
> would expect:
> 
> def date_compare(list1, 
> list2):
>     x = list1[2]
>     y = list2[2]
>     if 
> x>y:
>         return 
> 1
>     elif 
> x==y:
>         return 
> 0
>     else: # 
> x<y
>         return -1
> 
> But as before sorting with this function returns None.
> 
> What have I overlooked?

Lol.

I guess this is a FAQ. list.sort() performs a destructive in-place sort, 
and always return None. This is in the FineManual:

bruno at bruno:~$ python
Python 2.4.4c1 (#2, Oct 11 2006, 21:51:02)
[GCC 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
 >>> help(list.sort)
Help on method_descriptor:

sort(...)
     L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
     cmp(x, y) -> -1, 0, 1

You may want to use sorted(iterable, cmp=None, key=None, reverse=False) 
if you don't want to sort in-place.

Also, using comparison functions is usually not the most efficient way 
to do such a sort. In your case, I'd go for a good old 
Decorate/sort/undecorate (AKA schwarzian transform):

events = [evt for date, evt in
           sorted([(evt[2], evt) for evt in events])]


HTH



More information about the Python-list mailing list