sorting a list of lists

Peter Otten __peter__ at web.de
Mon Aug 27 13:17:16 EDT 2007


 nicksavill at googlemail.com wrote:

> i would like to sort a list of lists. The list is first sorted on the
> second item in the sub-lists (which I can do), then on the third item
> (which I can't).
> 
> eg. records = [['dog',1,2], ['chair',2,1], ['cat',1,3], ['horse',3,4],
> ['table',3,2], ['window',3,5]]
> 
> I want sorted to [['dog',1,2], ['cat',1,3], ['chair',2,1], ['table',
> 3,2], ['horse',3,4], ['window',3,5]]
> 
> To sort on the second item in the sub-lists I do the following
> 
> pass1 = itemgetter(1)
> sorted(records, key=pass1)
> 
> How can I then sort on the third item in the sub-lists whilst keeping
> the order on the second item?

list.sort() is stable, so

items = sorted(records, key=itemgetter(2)) # minor order first
items.sort(key=itemgetter(1)) # major order

should give the desired result (items with equal item[1] are sorted by
item[2]. Python 2.5 also allows to pass multiple indices to itemgetter()

sorted(records, key=itemgetter(1, 2))

IIRC for Python 2.4 you'd have to write your own key routine:

def key(item):
    return item[1], item[2]
sorted(records, key=key)

Peter



More information about the Python-list mailing list