Python Counter keys()返回值

时间:2016-01-28 20:42:48

标签: python counter

我有一个已根据出现次数排序的计数器。

counterlist = Counter({'they': 203, 'would': 138, 'your': 134,...}).

但当我counterlist.keys()时,返回列表是:

['wirespe', 'four', 'accus',...]

而不是

['they', 'would', 'your',...].

为什么?

4 个答案:

答案 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'])

另请参阅:Are dictionaries ordered in Python 3.6+?