我有一个已根据出现次数排序的计数器。
counterlist = Counter({'they': 203, 'would': 138, 'your': 134,...}).
但当我counterlist.keys()
时,返回列表是:
['wirespe', 'four', 'accus',...]
而不是
['they', 'would', 'your',...].
为什么?
答案 0 :(得分:13)
Counter()
Counter是用于计算可哈希对象的dict子类。它是一个无序集合,其中元素存储为字典键,它们的计数存储为字典值。
是一个无序的字典,因此它不会保持将它们添加到字典中的顺序。如果您想按顺序保留它们,则需要使用OrderedDict()
如果您想要一个OrderedCounter()
,那么您可以执行此操作,我将从here提取这些内容,并解释其工作原理。
from collections import *
class OrderedCounter(Counter, OrderedDict):
pass
counterlist = OrderedCounter({'would': 203, 'they': 138, 'your': 134})
print counterlist.keys()
答案 1 :(得分:3)
当您按特定顺序在字典中输入值时,dict不会保留任何类型的顺序。 dict上的.keys()
没有特定的顺序返回。有OrderedDict
确实保留了订单,但我不知道它与Counter
的交互方式。
编辑:
您可能想要使用Counter.most_common()。这将返回将按顺序排列的元组列表。
答案 2 :(得分:1)
另一个没有创建额外类的解决方案是获取您拥有的项目集,并根据计算的键对它们进行排序。以下代码基于@ user3005486:
import collections
#if this is your list
list_to_be_sorted = ['they', 'would', 'they', ...]
#then counterlist = {'would': 203, 'they': 138, 'your': 134}
counterlist = collections.Counter(list_to_be_sorted)
#if you sort this list ascendingly you get ['would', 'would', ..., 'they', 'they', ...etc.]
sorted_words = sorted(counterlist, key: lambda x:-counterlist[x])
distinct_words_from_list = set(list_to_be_sorted)
sorted_distinct_list = sorted(distinct_words_from_list, key: lambda x:-counterlist[x])
#then sorted_distinct_list = ['would', 'they', 'your']
答案 3 :(得分:0)
问题是从2016年开始的,与此同时,Python中的字典保证了遵守PEP 468的插入顺序。
来自docs:
在3.7版中进行了更改:dict作为Counter子类,继承了记住插入顺序的功能。对Counter对象的数学运算也保留顺序。根据在左操作数中首先遇到元素的时间,然后按照在右操作数中遇到的顺序,对结果进行排序。
因此,对于Python> = 3.7
counterlist = Counter({'they': 203, 'would': 138, 'your': 134,...})
counterlist.keys()
# Out: dict_keys(['they', 'would', 'your'])