Re: Sorting a List of Lists



apotheos@xxxxxxxxx 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@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
.



Relevant Pages

  • Re: Q: sorts key and cmp parameters
    ... The problem is that if you allow to use the cmp, ... There's no reason why a hypothetical comparison function for sort() needs ... but since this is going to especially useful for really big lists, ...
    (comp.lang.python)
  • Re: When random isnt random
    ... reliable shuffling is not a special case of sorting. ... Personally I think it would be more important to add Sort and Move methods ... > data is not necessarily the one provided for sorting quasi-random data. ... So I don't recommend to use a random comparison function any more, ...
    (borland.public.delphi.language.objectpascal)
  • Re: TList.Sort running 3 times?
    ... The next loop will call the comparison function twice. ... SCompare will return 1 the first time. ... positions at the outset rather than calling Sort each time you call Add. ...
    (alt.comp.lang.borland-delphi)
  • Re: Python 3.0, rich comparisons and sorting order
    ... I'm changing my approach to the sorting ... sort() already accepts a key function to be passed. ... passing a comparison function to sort; ... blog: http://rascunhosrotos.blogspot.com blog: http://pythonnotes.blogspot.com mail: carribeiro@gmail.com ...
    (comp.lang.python)
  • Re: sorting list of tuples by second (third...) tuple item
    ... I stepped into this an old post: (Thu Feb 14 20:40:08 CET ... element that you want to sort on, and the entire line, sorts that ... When compared, tuples first compare on the first element, then on the second etc... ... In these cases I had to use an ad hoc comparison function. ...
    (comp.lang.python)