如何按值对Python dict的键进行排序

时间:2010-08-05 18:09:40

标签: python sorting dictionary

我有一个看起来像这样的词典

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

我想将其转换为DESC并创建一个仅包含关键字的列表。例如,这将返回

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

我发现的所有例子都使用lambda,而我对此并不是很强。有没有办法可以循环使用它,并在我去的时候对它们进行排序?感谢您的任何建议。

PS:如果有帮助的话,我可以用不同的方式创建初始字典。

5 个答案:

答案 0 :(得分:43)

您可以使用

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

(您不需要Python 2.x中的list

theDict.__getitem__实际上相当于lambda x: theDict[x]

(lambda只是一个匿名函数。例如

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

这相当于

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

答案 1 :(得分:18)

>>> d={ "keyword1":3 , "keyword2":1 , "keyword3":5 , "keyword4":2 }
>>> sorted(d, key=d.get, reverse=True)
['keyword3', 'keyword1', 'keyword4', 'keyword2']

答案 2 :(得分:2)

我总是这样做....使用排序方法有优势吗?

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

哎呦没有读到关于不使用lambda =(

答案 3 :(得分:2)

我想出这样的事情:

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

KennyTM's solution更好:)

答案 4 :(得分:1)

无法对dict进行排序,只能获得已排序的dict的表示形式。 Dicts固有的顺序较少,但其他类型,如列表和元组,则不是。所以你需要一个排序表示,它将是一个列表 - 可能是一个元组列表。例如,

'''
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

<强>输出:

[('Vanita', {'score': 56}), ('Anil', {'score': 69}), ('Rahul', {'score': 75}), ('Dinesh', {'score': 78}), ('Anup', {'score': 95}), ('Suhas', {'score': 95})]