关于python:按最高值排序dict?

Sort dict by highest value?

本问题已经有最佳答案,请猛点这里访问。

我有一个带字符串键和int值的dict。有没有什么方法可以让我拿着这个听写本,用它来从最高到最低的键列表?

例子:

1
2
3
4
>>> myDict = {'seven': 7, 'four': 4, 'one': 1, 'two': 2, 'five': 5, 'eight': 8}
>>> myList = myDict.sortNumericallyByKeys
>>> myList
['eight', 'seven', 'five', 'four', 'two', 'one']


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


有一种方法可以做到:

1
2
3
>>> 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来获取相应的dict值,但它可以是几乎任何东西。例如,您可以使用其他答案所示的operator.itemgetter(1)myDict.get或任何其他排序功能(按值除外)。


另一个变化:

1
2
3
4
import operator

d = {'q':2, 'x':1, 'b':10}
s = sorted(d.iteritems(), key=operator.itemgetter(1), reverse=True)

operator模块提供了itemgetter模块,设计成这样使用。它比lambda快。;-)

编辑:

我有点误解了这个问题。我的解决方案返回一个元组(键、值)列表,而不仅仅是字符串列表。

作为弥补的一个额外好处,请看一下collections.OrderedDict。您可能还需要考虑使用"reversed"这句话。例如,切换键和值。


您可以使用items获取成对键值的列表,使用sorted根据您的条件对它们进行排序:

1
myList = sorted(myDict.items(), key=lambda x: x[1], reverse=True)

如果你使用的是ipython,你可以输入mydict.tabtab,你会得到所有函数的列表。您还可以键入print myDict.items.__doc__并快速获得文档。

关键参数是一个在进行比较之前应用于元素的函数。由于items返回一个对列表,对pairs的第二个元素进行排序,key是一个从元组中获取第二个元素的函数。

当然,可以通过以下方式消除items呼叫:

1
myList = sorted(myDict, key=myDict.get, reverse=True) #posted in another answer