以降序遍历 collections.Counter() 实例的 Pythonic 方式?

Posted

技术标签:

【中文标题】以降序遍历 collections.Counter() 实例的 Pythonic 方式?【英文标题】:Pythonic way to iterate over a collections.Counter() instance in descending order? 【发布时间】:2012-06-17 17:12:13 【问题描述】:

在 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 的字符串表示是这样做的,只是想知道是否有推荐的方法。

【问题讨论】:

【参考方案1】:

您可以遍历c.most_common() 以按所需顺序获取项目。另请参阅documentation of Counter.most_common()

例子:

>>> c = collections.Counter(a=1, b=999)
>>> c.most_common()
[('b', 999), ('a', 1)]

【讨论】:

【参考方案2】:

以下是在 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
 

【讨论】:

【参考方案3】:

仅返回降序即可解决您的问题,但这里是通用的方法。万一其他人从谷歌来到这里,这就是我必须解决的问题。基本上,您上面所拥有的内容会返回 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]

【讨论】:

以上是关于以降序遍历 collections.Counter() 实例的 Pythonic 方式?的主要内容,如果未能解决你的问题,请参考以下文章

树集以降序排列元素

默认以降序加载 Datagrip 表

使用 GROUP BY 和 ORDER BY 子句以降序打印记录

如何以降序对ios中添加的UIImage添加NSMutableArray进行排序

使用 2 个表和 3 个日期字段连接以降序获取多个日期的问题

简单的数组排序