lets say you have this dictionary:
{'a': 2,
'b': 4,
'c': 3,
'd': 1}
.. and you want to convert it into a list, sorted by value (not key), like this:
[('d', 1),
('a', 2),
('c', 3),
('b', 4)]
There is a Python Recipe for it with various implementations discussed in the comments.My favorite one is this:
sorted(foo.items(), key=lambda(k,v):(v,k))
6 comments:
you can also do:
sorted(a.items(), key=lambda (k,v): v)
or use operator:
sorted(a.items(),key=operator.itemgetter(1))
>>> x = { 'a':2, 'b':4, 'c':3, 'd':1 }
>>> from operator import itemgetter
>>> sorted(x.iteritems(), key=itemgetter(1))
[('d', 1), ('a', 2), ('c', 3), ('b', 4)]
This is nicer IMHO. You should almost always use iteritems() instead of items(), and itemgetter() is a nicer way to extract what you need to sort on without the ugly lambda.
if you are just interest in having the keys in sorted order, you can also use:
sorted(a, key=a.__getitem__)
Corey,
Your example:
sorted(foo.items(), key=lambda(k,v):(v,k))
sorts primarily on values, but if they are the same, will then sort on keys. This is not equivalent to a plain sort on values.
- Paddy.
To follow up on what "anonymous" said, I tested these methods (lambdas, iteritems, etc) for runtime, and the itemgetter method seems to be fastest for python 2.4, at least. YMMV of course... Cheers, Gregg
http://writeonly.wordpress.com/2008/08/30/sorting-dictionaries-by-value-in-python-improved/
Jeremy: thanks, exactly what I was looking for. None of the other solutions actually return a sorted dict, but convert it to a list sorted tuples. Right?
Post a Comment