用Python按值对字典进行排序。

4
我有一个字典,以单词为键,以整数为值。
是否可以按值对字典进行排序?
我希望能够获取字典中出现次数最多的前10个单词。值表示单词计数,键表示单词。
counter = 9
for a,b in sorted(dict_.iteritems()):
        if counter > 0:
            print str(a),str(b)+"\n"
            counter-=1

这是我目前的代码,但它只打印字典中的前10个项目。如何打印前10个最常见的项目?(即具有最高整数值的值?)
5个回答

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

难道现在不是这样写的吗? for a, b in sorted(dict_.iteritems(), key=lambda item: item[1], reverse=True)[:10]: - Michael Tomkins
@MichaelTomkins:是的!2011年的我可能错过了那个。 - nmichaels

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

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

根据元素值进行排序。您可以使用reverse=True参数来反转结果的顺序(默认顺序为升序),并使用切片符号(results[:10])仅迭代前10个元素。您也可以省略反转标志,使用[-10:]获取前10个。


1
啊,我喜欢一些 operator - jathanism

2
尝试使用sorted(dict_.iteritems(), key=lambda item: -item[1])进行排序。

@khachik:这是为了将列表反转。 - nmichaels
@nmichaels:然后应该通过lambda x:(x [0],-x [1])将其映射回来?为什么不用sorted(...,key = ...,reverse = True) - khachik
否定键和添加reverse=True具有等效的效果。返回的排序项没有影响,只有它们的顺序。我使用负键是因为这是我的个人风格偏好。 - Walter Mundt

1

你无法对字典进行排序。它们是无序的,即顺序未定义且完全没有意义(对于你来说)。

但是,你可以使用 .iteritems()key=operator.itemgetter(1) 进行排序(其他答案会否定值,但你可以使用切片 [-10:] 来获取最后 10 个项目)。或者,在这种特殊情况下,只需使用 collections.Counter,它带有一个 .most_common(n) 方法。


字典是无序的这一点很明显,但问题是能否按值对其进行排序。 - damned

0
为了实现这个目标,您应该使用“key”参数进行排序。 “key”必须是一个函数,它以一个元素作为输入并返回另一个可排序的元素,它将使用此键排序整个元素。然后取最后10个元素(按升序排序)。在您的情况下,您需要执行以下操作:
for a,b in sorted(key=lambda x: (x[1], x[0]), dict_.iteritems())[-10:]:
    print str(a), str(b)

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