sort by last then by first
Peter Abel
p-abel at t-online.de
Wed Jan 29 18:41:48 EST 2003
Alex Martelli <aleax at aleax.it> wrote in message news:<X7RZ9.100045$0v.2892758 at news1.tin.it>...
> Peter Abel wrote:
> ...
> > If you change the order of sorting from
> > low order key to high order key, I can't see
> > any reason, why this shouldn't work stable.
>
> the list.sort method is NOT guaranteed to be stable.
> It generally LOOKS stable, for small enough lists,
> up to Python 2.2 -- and it has been changed to one
> that happens to be stable in 2.3 -- but it's never
> a good idea to rely on such things, which may well
> change from one version to another: list.sort at any
> time will be the fastest sort Tim Peters can think
> up, whether that's a stable one or not.
>
> If you DO need a stable sort, see:
> http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52234
>
> > # 1) Sort by 3rd name
> >>>> l.sort(lambda a,b:cmp(a[2],b[2]))
> # 2) Sort by 2nd name
> >>>> l.sort(lambda a,b:cmp(a[1],b[1]))
> # 3) Sort by 1st name
> >>>> l.sort()
> ...
> > Though I can't say anything about speed.
>
> I can: it will be lousy. Besides, for this example, just
> the "# 3)" call happens to have the same end result as
> 1 then 2 then 3, because sequences compare lexicographically.
>
Unfortunately --- thank God --- your're right !:-)
Think I've been taken by Brian Kransons's example:
Kranson> >>> names=[['Flintstone', 'Fred'],['Flintstone', 'Wilma'],
Kranson> ['Rubble', 'Barney'],['Rubble', 'Betty'],['Flintstone', 'Pebbles']]
Kranson> >>> names.sort() #this will sort by last name
Kranson> >>> print names
Kranson> [['Flintstone', 'Fred'], ['Flintstone', 'Wilma'], ['Rubble',
Kranson> 'Barney'], ['Rubble', 'Betty'], ['Flintstone', 'Pebbles']]
Kranson> ...
Kranson> ...
Kranson> >>> names=[['Flintstone', 'Fred'],['Flintstone', 'Wilma'],
Kranson> ['Rubble', 'Barney'],['Rubble', 'Betty'],['Flintstone', 'Pebbles']]
Kranson> >>> names.sort(lambda a, b: cmp(a[1], b[1])) #this will sort by
Kranson> first name
Kranson> >>> print names
Kranson> [['Rubble', 'Barney'], ['Rubble', 'Betty'], ['Flintstone', 'Fred'],
Kranson> ['Flintstone', 'Pebbles'], ['Flintstone', 'Wilma']]
That made me believe, that changing his order of sorting would
be necessary to change the order of sorting result.
> The (printed) Python Cookbook's chapter on Sorting and
> Searching has a lot of useful and interesting info on
> such issues, particularly in Tim Peter's introduction.
>
>
> Alex
Think, I should learn that Cookbooks are not only
good to use in kitchen :-)
BTW Can one say under which circumstances the sort-function
happens to be not stable. I did some tries with 100 000 items
each with 3 or 5 random letters 'A' to 'Z' including some
equal items. But with the normal sort and the decorated
sort and I couldn't find any results
that differed from each other?? (it took me more time
to generate the list than to sort them !!)
Ciao
Peter
More information about the Python-list
mailing list