2016-12-03 73 views
8

考虑从一个映射初始化一个基本的计数器:的Python - 创建一个从映射计数器(),非整数值

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上测试了它,并得到了相同的结果。这似乎违反了计数器的最基本规则,其中“元素被存储为字典键并将其计数存储为字典值”。计数器是否应允许非整数值?它不应该抛出一个错误或什么?什么解释了这种行为?

回答

8

有一个计数器对象的值没有任何限制,这是文件中明确提出:

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,如果你有unorderable类型作为计数器对象的值:

>>> 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字典。

+0

谢谢!这非常有帮助。 – GHH

+0

@GHH如果有帮助,你可以考虑接受答案 –