我需要得到一个dict的有序表示,按值的降序排序(dict中的最大值,首先显示)。
样品:
mydict={u'jon':30,u'den':26,u'rob':42,u'jaime':31}
我需要像
一样展示它们rob=42
jaime=31
jon=30
den=28
我试过这个
from operator import itemgetter
sortedvalues=sorted(mydict,key=itemgetter(1))
当我打印列表时,我得到了
[u'jaime', u'den', u'rob', u'jon']
此列表无序!我错过了有关排序内置的用法吗?或者我是否错误地使用了itemgetter?
答案 0 :(得分:11)
这是一个有趣的问题,因为如果键是另一个不可索引的类型(比如整数),你就不会出现错误,这是由于一系列微妙的事情:
iter(mydict)
的字典来迭代字典,这将调用mydict.__iter__()
iter(mydict)
与mydict.iterkeys()
相同。itemgetter(1)
将处理字符串值,获取字符串中的第二个字符。 如果任何字符串的长度都是1-char,那么你所拥有的代码会因为IndexError而失败,你只是幸运的。 (或者没有,取决于你如何看待它,因为获得IndexError会让你更快地意识到这个问题。)
如果您只想要值,您想要做的是:
sorted(mydict.values(), reverse=True)
如果您想要成对的按键,则需要
sorted(mydict.iteritems(), key=itemgetter(1), reverse=True)
答案 1 :(得分:5)
它们按名称中的第二个字母排序;迭代一个字典产生它的键。
sorteditems = sorted(mydict.iteritems(), key=itemgetter(1))
答案 2 :(得分:3)
迭代字典(这是sorted
函数所做的)只会给你它的键:
>>> sorted(mydict)
[u'den', u'jaime', u'jon', u'rob']
相反,您希望对键和值进行排序 - 为此,您可以使用mydict.items()
(或mydict.iteritems()
,这对于大型词条更有效):
>>> sorted(mydict.items())
[(u'den', 26), (u'jaime', 31), (u'jon', 30), (u'rob', 42)]
然后您的代码将按预期工作:
>>> from operator import itemgetter
>>> sorted(mydict.items(), key = itemgetter(1))
[(u'den', 26), (u'jon', 30), (u'jaime', 31), (u'rob', 42)]
如果多个键具有相同的值,您可能还希望使用dict键作为辅助排序值进行排序:
>>> mydict={u'a': 1, 'z': 1, 'd': 1}
>>> sorted(mydict.items(), key = itemgetter(1))
[(u'a', 1), ('z', 1), ('d', 1)]
>>> sorted(mydict.items(), key = itemgetter(1, 0))
[(u'a', 1), ('d', 1), ('z', 1)]