Saltycrane logo

SaltyCrane Blog

Notes on Python, Django, and web development on Ubuntu Linux

    

How to sort a Python dict (dictionary) by keys or values

How to sort a dict by keys (Python 2.4 or greater):
mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

for key in sorted(mydict.iterkeys()):
    print "%s: %s" % (key, mydict[key])
Results:
alan: 2
bob: 1
carl: 40
danny: 3

Taken from the Python FAQ: http://www.python.org/doc/faq/general/#why-doesn-t-list-sort-return-the-sorted-list. To sort the keys in reverse, add reverse=True as a keyword argument to the sorted function.

How to sort a dict by keys (Python older than 2.4):
keylist = mydict.keys()
keylist.sort()
for key in keylist:
    print "%s: %s" % (key, mydict[key])

The results are the same as the above.

How to sort a dict by value (Python 2.4 or greater):
for key, value in sorted(mydict.iteritems(), key=lambda (k,v): (v,k)):
    print "%s: %s" % (key, value)
Results:
bob: 1
alan: 2
danny: 3
carl: 40
Taken from Nick Galbreath's Digital Sanitation Engineering blog article
See also:

20 Comments — feed icon Comments feed for this post


#1 Marius commented on 2007-11-30:

Thank you.


#2 Sven Siegmund commented on 2008-05-07:

Thanks a lot. Exactly what I was looking for.


#3 Mike commented on 2008-09-11:

Thanks, "How to sort a dict by value" was helpful. :)


#4 Gregg Lind commented on 2008-09-12:

Thanks for the link to my article. If you need faster dictionary sorting than the ones you describe, it has some tips, as Nick's updated blog also shows.


#5 Eliot commented on 2008-09-12:

Gregg, Good work-- your article shows that you have obviously explored this topic much more thoroughly than I have. I will definitely try your method the next chance I get.


#6 Rama krishna commented on 2011-02-11:

tnx


#7 gcd0318 commented on 2011-02-15:

are you sure this works? please see my result (I did in python shell):

>>> d={80: '0101', 75: '1011', 85: '0001', 70: '1111'}
>>> d
{80: '0101', 75: '1011', 85: '0001', 70: '1111'}
>>> kl=list(d.keys())
>>> kl
[80, 75, 85, 70]
>>> new_kl = kl + []
>>> new_kl
[80, 75, 85, 70]
>>> new_kl.sort()
>>> new_kl
[70, 75, 80, 85]
>>> new_d = {}
>>> for k in new_kl:
    new_d[k] = d[k]
    print(new_d)

{70: '1111'}
{75: '1011', 70: '1111'}
{80: '0101', 75: '1011', 70: '1111'}
{80: '0101', 75: '1011', 85: '0001', 70: '1111'}
>>> new_d
{80: '0101', 75: '1011', 85: '0001', 70: '1111'}
>>>

#8 Eliot commented on 2011-03-28:

gcd0318:
The items in a dict are stored in an undefined order. Printing the dict only confirms this fact.

If you need to operate on items in a dict in a sorted order, you can operate on each item within the for loop.

Or you can use a data structure that preserves order such as a list or the new OrderedDict data structure in the collections module added in Python 2.7. See http://docs.python.org/library/collections.html#collections.OrderedDict


#9 ovi commented on 2011-08-04:

Can someone explain the following behavior:

DICT = {'C':'C','G':'G','S':'S','E':'E','GE':'GE','fRrc':'GE','fAct':'FO'}

print DICT {'C': 'C', 'E': 'E', 'G': 'G', 'S': 'S', 'fRrc': 'GE', 'GE': 'GE', 'fAct': 'FO'}

Why is the order of the elements in the dictionary changed?

In fact, from what I've understood, there is no defined order about how the elements are stored.

So, the question is ... there is such a structure in python? (I don't want the dictionary to be sorted, I just want to preserve the order how they were initially added).

Thanks


#10 Joe commented on 2012-01-31:

Sweet, thanks for the simple solution!


#11 Abi commented on 2012-11-09:

Thank you. Perfect. Just what I was looking for!


#12 Terry commented on 2013-02-04:

Thanks for that! I was going wild on python.org trying to figure out how to do this.


#13 adithya commented on 2013-02-18:

thanks..:)


#14 Zoynels commented on 2013-06-08:
mydict = {'carl':40, 'alan':2, 'bob':1, 'danny':3}

print ('Sort by keys:')
for key in sorted(mydict.keys()):
    print ("%s: %s" % (key, mydict[key]))

print ('Sort by items:')
for key, value in sorted(mydict.items(), key=lambda item: (item[1], item[0])):
    print ("%s: %s" % (key, value))

#15 Zoynels commented on 2013-06-08:

my code works in Python 3.3


#16 Pere Vilas commented on 2013-07-29:

It works perfect on 2.7. Thanks!


#17 Roberto commented on 2013-08-13:

this works


#18 asdasd commented on 2013-10-25:

Thanks


#19 emma lee commented on 2013-12-17:

it work well, thx a lot


#20 Grant Jenks commented on 2014-03-28:

Its worth noting that Python has a number of dictionary implementations that maintain the order based on the key. Consider the sortedcontainers module which is pure-Python and fast-as-C implementations. Iteration is really fast and automatically yields the keys/items in sorted order. There's also a performance comparison that benchmarks popular options against one another.

Post a comment

Required
Required, but not displayed
Optional

Format using Markdown. (No HTML.)
  • Code blocks: prefix each line by at least 4 spaces or 1 tab (and a blank line before and after)
  • Code span: surround with backticks
  • Blockquotes: prefix lines to be quoted with >
  • Links: <URL>
  • Links w/ description: [description](URL)
Created with Django | Hosted by Linode