58

在 Python 2.7 中,我想以递减计数顺序迭代一个collections.Counter实例。

>>> import collections
>>> c = collections.Counter()
>>> c['a'] = 1
>>> c['b'] = 999
>>> c
Counter({'b': 999, 'a': 1})
>>> for x in c:
        print x
a
b

在上面的示例中,元素似乎按照它们添加到 Counter 实例的顺序进行迭代。

我想从最高到最低遍历列表。我看到 Counter 的字符串表示可以做到这一点,只是想知道是否有推荐的方法来做到这一点。

4

3 回答 3

62

您可以迭代c.most_common()以按所需顺序获取项目。另请参阅 的文档Counter.most_common()

例子:

>>> c = collections.Counter(a=1, b=999)
>>> c.most_common()
[('b', 999), ('a', 1)]
于 2012-06-14T16:06:17.167 回答
14

这是在 Python 集合中迭代 Counter 的示例:

>>>def counterIterator(): 
...  import collections
...  counter = collections.Counter()
...  counter.update(('u1','u1'))
...  counter.update(('u2','u2'))
...  counter.update(('u2','u1'))
...  for ele in counter:
...    print(ele,counter[ele])
>>>counterIterator()
u1 3
u2 3
 
于 2017-06-28T03:28:38.183 回答
10

您的问题已解决,只需返回降序,但这里是一般的方法。万一有人从谷歌来到这里,这就是我必须解决的问题。基本上,您上面所拥有的内容会返回 collections.Counter() 中字典的键。要获取值,您只需将密钥传递回字典,如下所示:

for x in c:
    key = x
    value = c[key]

我有一个更具体的问题,我有字数,想过滤掉低频的。这里的诀窍是制作 collections.Counter() 的副本,否则当您尝试从字典中删除它们时,您将收到“RuntimeError:dictionary changed size during iteration”。

for word in words.copy():
    # remove small instance words
    if words[word] <= 3:
        del words[word]
于 2017-05-02T16:48:14.623 回答