sorting a list of list
Matt Nordhoff
mnordhoff at mattnordhoff.com
Wed Nov 21 06:44:35 EST 2007
Tim Chase wrote:
>> are there available library or pythonic algorithm for sorting a list
>> of list depending on the index of the list inside the list of my
>> choice?
>
> The built-in sorted() function and the sort() method on various
> collections take an optional "key=function" keyword paramater
> with which you can pass a function (lambdas are convenient) to
> extract the bit on which you want to compare:
>
>>>> d_list = [
> ... ['a', 1, 9],
> ... ['b', 2, 8],
> ... ['c', 3, 7],
> ... ['d', 4, 6],
> ... ['e', 5, 5],
> ... ]
>>>> print sorted.__doc__
> sorted(iterable, cmp=None, key=None, reverse=False) --> new
> sorted list
>>>> sorted(d_list, key=lambda x: x[2]) # sort by the 3rd item
> [['e', 5, 5], ['d', 4, 6], ['c', 3, 7], ['b', 2, 8], ['a', 1, 9]]
>>>> sorted(d_list, key=lambda x: x[1]) # sort by the 2nd item
> [['a', 1, 9], ['b', 2, 8], ['c', 3, 7], ['d', 4, 6], ['e', 5, 5]]
>>>> sorted(d_list, key=lambda x: x[0]) # sort by the 1st item
> [['a', 1, 9], ['b', 2, 8], ['c', 3, 7], ['d', 4, 6], ['e', 5, 5]]
Not to be too complicated, but there are functions that return a
callable that is faster than a lambda.
>>> import operator
Then, instead of "lambda x: x[2]" use "operator.itemgetter(2)" and
instead of "lambda x: x.foo" use "operator.attrgetter('foo')".
--
More information about the Python-list
mailing list