23

I have a dict that looks like this

{ "keyword1":3 , "keyword2":1 , "keyword3":5 , "keyword4":2 }

And I would like to convert it DESC and create a list of just the keywords. Eg, this would return

["keyword3" , "keyword1" , "keyword4" , "keyword2"]

All examples I found use lambda and I'm not very strong with that. Is there a way I could loop through this, and sort them as I go? Thanks for any suggestions.

PS: I could create the initial dict differently if it would help.

Aran-Fey
  • 35,525
  • 9
  • 94
  • 135
Shane Reustle
  • 8,126
  • 8
  • 38
  • 49
  • possible duplicate of [Sort a Python dictionary by value](http://stackoverflow.com/questions/613183/sort-a-python-dictionary-by-value) – Teepeemm Sep 08 '15 at 20:42

5 Answers5

45

You could use

res = list(sorted(theDict, key=theDict.__getitem__, reverse=True))

(You don't need the list in Python 2.x)

The theDict.__getitem__ is actually equivalent to lambda x: theDict[x].

(A lambda is just an anonymous function. For example

>>> g = lambda x: x + 5
>>> g(123)
128

This is equivalent to

>>> def h(x):
...   return x + 5
>>> h(123)
128

)

kennytm
  • 491,404
  • 99
  • 1,053
  • 989
  • +1 Used this to numerically sort filenames containing integers. names = {} for f in sys.argv[1:] : robj = re.search( "([0-9]+)", f ) if robj is not None : names[f] = int(robj.group(1)) res = list(sorted(names,key=names.__getitem__)) print "\n".join(res) – David Poole Oct 25 '11 at 15:08
18
>>> d={ "keyword1":3 , "keyword2":1 , "keyword3":5 , "keyword4":2 }
>>> sorted(d, key=d.get, reverse=True)
['keyword3', 'keyword1', 'keyword4', 'keyword2']
John La Rooy
  • 281,034
  • 50
  • 354
  • 495
2

i always did it this way....are there advantages to using the sorted method?

keys = dict.keys()
keys.sort( lambda x,y: cmp(dict[x], dict[y]) )

whoops didnt read the part about not using lambda =(

JiminyCricket
  • 6,632
  • 7
  • 41
  • 58
2

I would come up with something like this:

[k for v, k in sorted(((v, k) for k, v in theDict.items()), reverse=True)]

But KennyTM's solution is much nicer :)

Community
  • 1
  • 1
Messa
  • 22,818
  • 5
  • 58
  • 84
1

It is not possible to sort a dict, only to get a representation of a dict that is sorted. Dicts are inherently order less, but other types, such as lists and tuples, are not. So you need a sorted representation, which will be a list—probably a list of tuples. For instance,

'''
Sort the dictionary by score. if the score is same then sort them by name 
{ 
 'Rahul'  : {score : 75} 
 'Suhas' : {score : 95} 
 'Vanita' : {score : 56} 
 'Dinesh' : {score : 78} 
 'Anil'  : {score : 69} 
 'Anup'  : {score : 95} 
} 
'''
import operator

x={'Rahul' : {'score' : 75},'Suhas' : {'score' : 95},'Vanita' : {'score' : 56}, 
   'Dinesh' : {'score' : 78},'Anil' : {'score' : 69},'Anup' : {'score' : 95} 
  }
sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1))
print sorted_x

output:

[('Vanita', {'score': 56}), ('Anil', {'score': 69}), ('Rahul', {'score': 75}), ('Dinesh', {'score': 78}), ('Anup', {'score': 95}), ('Suhas', {'score': 95})]
cs95
  • 330,695
  • 80
  • 606
  • 657
Sagar Pise
  • 817
  • 9
  • 20