考虑从映射初始化的基本计数器:
dict_1 = {'a': 1, 'b': 2, 'c': 3}
count_1 = Counter(dict_1)
print count_1
>>> Counter({'c': 3, 'b': 2, 'a': 1})
一切都有道理。但Counter也允许我从一个非整数作为键和值的字典初始化。例如,
dict_2 = {'a': 'apple', 'b': 'banana', 'c': 'cheese'}
count_2 = Counter(dict_2)
print count_2
>>> Counter({'c': 'cheese', 'b': 'banana', 'a': 'apple'})
上面编写的代码是Python 2.7,但我也在Python 3.5上测试过,得到了相同的结果。这似乎违反了计数器的最基本规则,其中“元素存储为字典键,其计数存储为字典值”。计数器应该允许不是整数的值吗?它不应该抛出错误或什么?是什么解释了这种行为?
答案 0 :(得分:9)
对象对象的值没有限制,这在文档中有明确说明:
Counter
类本身是一个没有限制的字典子类 关于它的关键和价值观。值意图为数字 表示计数,但您可以在值字段中存储任何。
[强调我的]
一些Counter
方法的行为也在一般情况下描述,例如:
most_common()
方法仅要求可以订购这些值。
>>> count_2.most_common()
[('c', 'cheese'), ('b', 'banana'), ('a', 'apple')]
>>> count_2.most_common(2)
[('c', 'cheese'), ('b', 'banana')]
因此,如果您在计数器对象中具有不可排序的类型作为值,那么很容易在Python 3中遇到问题:
>>> count_2['d'] = 2
>>> count_2
Counter({'c': 'cheese', 'a': 'apple', 'b': 'banana', 'd': 2})
>>> count_2.most_common()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\Python34\lib\collections\__init__.py", line 492, in most_common
return sorted(self.items(), key=_itemgetter(1), reverse=True)
TypeError: unorderable types: str() < int()
因此,您通常希望将值保留为对象的实际数量,并在值旨在为非数字类型或更严格的非整数时使用 vanilla 字典。