【问题标题】:Python - Create Counter() from mapping, non-integer valuesPython - 从映射、非整数值创建 Counter()
【发布时间】:2016-12-03 17:05:39
【问题描述】:

考虑一个从映射初始化的基本计数器:

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

【问题讨论】:

    标签: python counter


    【解决方案1】:

    对计数器对象的值没有限制,这在文档中有明确说明:

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

    【讨论】:

    • 谢谢!这很有帮助。
    • @GHH 如果有帮助,您可以考虑接受答案
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2020-09-23
    • 2012-01-26
    相关资源
    最近更新 更多