Initially data is this:
dict = {<User: user2>: {'diff': 48, 'alike': 1}, <User: user3>: {'diff': 42, 'alike': 2}, <User: user4>: {'diff': 45, 'alike': 1}, <User: user5>: {'diff': 43, 'alike':
2}, <User: user6>: {'diff': 46, 'alike': 1}, <User: user7>: {'diff': 46, 'alike': 1}, <User: user8>: {'diff': 49, 'alike': 1}, <User: user9>: {'diff': 50, 'ali
ke': 0}, <User: user10>: {'diff': 46, 'alike': 1}, <User: user11>: {'diff': 37, 'alike': 3}, <User: user12>: {'diff': 50, 'alike': 0}, <User: user13>: {'diff':
50, 'alike': 0}, <User: user14>: {'diff': 50, 'alike': 0}, <User: user15>: {'diff': 50, 'alike': 0}, <User: user16>: {'diff': 50, 'alike': 0}, <User: user17>: {
'diff': 50, 'alike': 0}, <User: user18>: {'diff': 50, 'alike': 0}, <User: user19>: {'diff': 50, 'alike': 0}, <User: user20>: {'diff': 50, 'alike': 0}}
Then I sort it:
sorted(dict) == [{'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'d
iff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 45, 'alike': 1}, {'diff': 46, 'alike': 1}, {'diff'
: 46, 'alike': 1}, {'diff': 46, 'alike': 1}, {'diff': 48, 'alike': 1}, {'diff': 49, 'alike': 1}, {'diff': 42, 'alike': 2}, {'diff': 43, 'alike': 2}, {'diff': 37
, 'alike': 3}]
How do I sort it by “diff”?
For one, you are not sorting a
dict– you are sorting a list ofdicts– these are very different things, not least as adictin Python has no defined order.You can do this easily with
sorted()andoperator.itemgetter():The
sorted()builtin takes thekeykeyword argument, which is a function which takes the value, and gives another value to sort on. Here we use anitemgetter()to get the desired value from thedictto sort by.Edit:
Given your change, there are two answers, as you are being unclear. If you want the list of values, it’s simply a case of extracting them from your original
dict:Which is as simple as taking
dict.values(). Naturally, under Python 2.x, you will want to useviewitems()oriteritems()for good performance.If you want to sort the
dictitself, it’s a different matter, asdicts (as I stated) are inherently unordered.First of all, I would like to note that
sorted(dict)does not produce the output you suggested – a dict iterates over the keys, not the values by default:Gives us:
To produce a sorted
dict, we need to usecollections.OrderedDict():Which gives us:
Note that here we had to use a
lambdastatement for the key argument, as anitemgetter()unfortunately can’t get multiple levels of items for us.