Sorting a List of Lists

Paddy paddy3118 at netscape.net
Wed Jan 31 13:09:53 EST 2007


On Jan 31, 12:35 pm, Bruno Desthuilliers <bruno.
42.desthuilli... at wtf.websiteburo.oops.com> wrote:
> apoth... 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

I agree with you B., but see the comments here:
  http://www.biais.org/blog/index.php/2007/01/28/23-python-sorting-
efficiency
for information on the relative speeds of rolling your own DSU versus
using itemgetter and key=...

- Paddy.





More information about the Python-list mailing list