为什么我不能在Python中迭代一个Counter?

时间:2013-11-29 04:06:49

标签: python python-2.7

为什么当我尝试执行以下操作时,我会得到need more than 1 value to unpack

for key,value in countstr:
    print key,value


for key,value in countstr:
ValueError: need more than 1 value to unpack

然而这很好用:

for key,value in countstr.most_common():
    print key,value

我不明白,是不是countstrcountstr.most_common()等同?

编辑: 感谢以下答案,我想我不明白的是:如果countstr是映射,那么countstr.most_common()是什么? - 我是Python的新手,对不起,如果我在这里遗漏了一些简单的东西。

4 个答案:

答案 0 :(得分:5)

不,他们不是。迭代映射(无论是collections.Counter还是dict或...)仅迭代映射的键。

还有另一个区别:迭代Counter的密钥以无定义的顺序传递它们。 most_common()返回的顺序已定义(按值的倒序排序)。

答案 1 :(得分:2)

不,他们不等同。 countstrCounter,它是字典的子类。迭代它一次产生1个键。 countstr.most_common()是一个包含2元组(有序键值对)的列表。

答案 2 :(得分:1)

counttr是一个Counter,它是用于计算可哈希对象的子类。这是一个无序集合,其中elements存储为dictionary keys,其counts存储为dictionary values

>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> list(c.elements())
['a', 'a', 'a', 'a', 'b', 'b'] 

答案 3 :(得分:0)

您不能直接迭代计数器值/键,但可以将它们复制到列表中并迭代该列表。

s = ["bcdef", "abcdefg", "bcde", "bcdef"]

import collections
counter=collections.Counter(s)

vals = list(counter.values())
keys = list(counter.keys())

vals[0]
keys[0]

输出:

 2
'bcdef'