按最高值对字典进行排序?

22
我有一个字典,其中键是字符串,值是整数。是否有办法使用这个字典来获取按值从高到低排列的键的列表?
例如:
>>> myDict = {'seven': 7, 'four': 4, 'one': 1, 'two': 2, 'five': 5, 'eight': 8}
>>> myList = myDict.sortNumericallyByKeys
>>> myList
['eight', 'seven', 'five', 'four', 'two', 'one']

@ᴋᴇʏsᴇʀ 我仔细查看了数据结构文档,但没有找到任何信息。我还能在哪里寻找? - Lucas Phillips
@ᴋᴇʏsᴇʀ 这样做会按照键的字母顺序进行排序,而不是按照值的数字顺序排序,你确定这样做是正确的吗? - Lucas Phillips
我想表达的是这个意思:这里 :p - keyser
@GiovanniP 这个 更接近,但两者都不是完全相同的。 - keyser
4个回答

28
sorted(myDict, key=myDict.get, reverse=True)

非常简洁,但是有点刺眼;-) - siebz0r
2
@ siebz0r,虽然应该只以这种方式完成。 - kaspersky
@gg.kaspersky 可能是这样,但可读性也很重要 ;-) - siebz0r
5
这几乎是最易读的了。 - De Novo
这实际上非常好和优雅。易于阅读和理解 @siebz0r - Javi

8
这里提供一种实现方式:
>>> myDict = {'seven': 7, 'four': 4, 'one': 1, 'two': 2, 'five': 5, 'eight': 8} 
>>> sorted(myDict.iterkeys(), key=lambda k: myDict[k], reverse=True)
['eight', 'seven', 'five', 'four', 'two', 'one']

(灵感来自这个答案)

该方法使用内置函数sorted(带有reverse=True参数以获得从高到低的排序结果), 而key参数则是一个用于设置排序键的函数。在这种情况下,它是一个lambda表达式,用于获取相应的字典值,但它可以是几乎任何东西。 例如,您可以像其他答案所示使用operator.itemgetter(1)myDict.get,或者任何其他排序函数(除了按值排序)。


不需要反转列表,因为sorted函数接受一个reverse参数。 - kaspersky

4
你可以使用 items 获取键值对列表,使用 sorted 根据你的条件进行排序:
myList = sorted(myDict.items(), key=lambda x: x[1], reverse=True)

如果您正在使用ipython,您可以键入myDict.tabtab,然后您将获得所有函数的列表。您也可以键入print myDict.items.__doc__来快速查看文档。
关键参数是在元素进行比较之前应用于元素的函数。由于items返回一对列表,并且排序是在第二个元素上完成的,因此关键字是一个从元组中获取第二个元素的函数。
当然,也可以通过使用以下方法来摆脱items的调用:
myList = sorted(myDict, key=myDict.get, reverse=True) #posted in another answer

2
cmp 被贬低了;请使用 key 代替。 - Hugh Bothwell
谢谢您的观察。 - kaspersky

2

另一种变体:

import operator

d = {'q':2, 'x':1, 'b':10}
s = sorted(d.iteritems(), key=operator.itemgetter(1), reverse=True)
operator 模块提供了 itemgetter,旨在用于此类情况。它比 lambda 更快。 ;-) 编辑: 我有点误解问题。我的解决方案返回一个元组列表(键、值),而不仅仅是一个字符串列表。
作为弥补的额外奖励,请看看 collections.OrderedDict。您可能还想考虑使用 dict 'reversed'。例如,交换键和值。

顺便提一下,交换字典的键和值可能有点奇怪(而且比根据值对键进行排序更困难)。如果您想这样做,那么您可能最初选择了错误的数据结构。 - De Novo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接