2012-03-24 68 views
6

我需要得到一个字典的排序表示,按照值的降序排列(首先显示字典中的最大值)。使用排序的内置函数排序python字典的值

样本:

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?

回答

11

这是一个有趣的问题,因为你并没有引起这样的错误,你将有钥匙是否被另一种非可索引类型(比如整数),这是由于一个微妙的一系列的事情:

  1. 排序(mydict,...)试图遍历字典使用的iter(mydict)等效它将调用mydict.__iter__()
  2. 迭代字典产生其,在效果iter(mydict)相同mydict.iterkeys()
  3. 您的密钥是字符串,由于字符串是可索引的,因此itemgetter(1)将对字符串值起作用,从而获取字符串中的第二个字符。

如果任何字符串的长度为1个字符,那么您使用的代码将失败并导致IndexError,那么您只能幸运了。 (或没有,取决于你如何看待它,因为得到IndexError会让你更快意识到这个问题。)

你想做的事,如果你只想要的值是什么:

sorted(mydict.values(), reverse=True) 

如果你想要的按键以及成对的,你想

sorted(mydict.iteritems(), key=itemgetter(1), reverse=True) 
+1

我意识到,阅读这个响应之前!并改为mydict.iteritems()..感谢您的帮助 – 2012-03-24 04:57:23

+0

什么时候应该使用dict.iteritems()而不是dict.items()? – 2012-03-24 05:00:04

+1

如果您只需要键:'sorted(mydict,key = mydict.get,reverse = True)' – 2012-03-24 05:33:25

5

它们按名称中的第二个字母排序;遍历一个字典产生它的键。

sorteditems = sorted(mydict.iteritems(), key=itemgetter(1)) 
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)] 

您可能还需要进行排序与​​作为辅助排序值的字典的关键,如果多个键具有相同的值:

>>> 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)]