2011-04-13 94 views
4

我有一个带有键的字典和值作为整数的字典。按python中的值对字典进行排序

是否可以按值排序字典?

我希望能够在我的字典中发现前10位最常出现的单词。这些值表示单词计数,键表示单词。

counter = 9 
for a,b in sorted(dict_.iteritems()): 
     if counter > 0: 
      print str(a),str(b)+"\n" 
      counter-=1 

这是我迄今为止但它仅打印关闭在字典中的第10个项目。我将如何打印出前10个最常见的项目? (即具有最高INT作为值值?)

回答

2

Python字典是无序的,但你可以将其转换为使用items()元组的列表,并通过一个合适的比较功能sortkey参数。

sorted()具有类似的关键参数。您想按lambda item: item[1]排序以获取items()iteritems()的值。然后你可以切掉前N个项目。

所以......

for a, b in sorted(dict_.iteritems(), key=lambda item: item[1], reverse=True)[:10]: 
    print a, b 
+0

这不是现在 '为A,B在排序(dict_.iteritems(),键=拉姆达项目:项目[1],反向= True)[:10]:' – 2014-07-22 13:07:57

+0

@MichaelTomkins:是! 2011我一定错过了。 – nmichaels 2014-07-22 13:46:10

2

尝试sorted(dict_.iteritems(), key=lambda item: -item[1])

+0

'-'是什么? – khachik 2011-04-13 18:13:54

+0

@khachik:这是要颠倒名单。 – nmichaels 2011-04-13 18:24:37

+0

@nmichaels:那么它应该由'lambda x:(x [0],-x [1])'映射回来?为什么不分类(...,key = ...,reverse = True)? – khachik 2011-04-13 18:26:53

2

使用

sorted(dict_.iteritems(), key=lambda x:x[1]) 

import operator 
sorted(.... key=operator.itemgetter(1)) 

排序基于元素的值。您可以使用reverse=True参数来反转结果的顺序(默认值或升序值)和切片符号(results[:10])以仅迭代前10个元素。您也可以省略反向标志,并使用[-10:]以获得前10名。

+1

啊,我爱我一些'运营商'。 – jathanism 2011-04-13 18:21:17

1

根本不能对字典进行排序。它们是无序的,即顺序没有定义,并且完全没有意义(对你而言)。

但是,您可以将.iteritems()key=operator.itemgetter(1)排序(其他答案会取消该值,但您可以使用片段[-10:]获取最后10个项目)。或者,在这种特殊情况下,只需使用collections.Counter,它随.most_common(n)方法一起提供。

+0

无序的字典是显而易见的,但问题是可以按值排序。 – damned 2012-02-05 16:28:18

0

为了做到这一点,您应该使用key参数进行排序。 key必须是一个函数,它将一个元素作为输入并返回另一个应该可排序的元素,并使用该键对整个元素进行排序。并取最后10个元素(它按升序排序)。在你的情况,你需要做这样的事情:

for a,b in sorted(key=lambda x: (x[1], x[0]), dict_.iteritems())[-10:]: 
    print str(a), str(b)