collections.Counter
对于收集计数和将计数作为对象进行操作非常有用。你可以这样做:
>>> Counter({'a': 2, 'b': 5}) + Counter({'a': 3, 'c': 7})
Counter({'c': 7, 'a': 5, 'b': 5})
这本质上是按项的键对项进行分组,并对每组的值求和
使用非整数值重用Counter
功能的最低代码方式是什么?
这些值将被定义为我已经想要的组值“减少”操作:例如字符串和列表(它们都将__add__
定义为串联)
目前,我们得到:
>>> Counter({'a': 'hello ', 'b': 'B'}) + Counter({'a': 'world', 'c': 'C'})
Traceback (most recent call last):
...
TypeError: '>' not supported between instances of 'str' and 'int'
>>> Counter({'a': [1, 2], 'b': [3, 4]}) + Counter({'a': [1, 1], 'c': [5, 6, 7]})
Traceback (most recent call last):
...
TypeError: '>' not supported between instances of 'list' and 'int'
在collections.Counter
的代码中,有一个硬编码的假设,即值是整数,因此self.get(k, 0)
和count > 0
之类的东西到处都是。因此,子类化Counter
似乎不会比重写我自己的专用(或通用)自定义类(可能使用collections.defaultdict
)少多少工作
相反,似乎包装值(例如str
和list
)以便能够像处理空元素一样处理0是一种优雅的方法
我会提出两个解决方案:
一个是包装值本身,尽管这里只保证涵盖问题中的示例:其他
Counter
操作不是:另一种方法是编写一个“类似计数器”的自定义类,将
defaultdict
子类化,然后再次实现__add__
方法我不会说“为集合类型定义整数加法”比仅仅重写
Counter
来完成您需要的工作更优雅。你需要非计数相关的行为,你需要一个不专注于计数的类基本上,
Counter
不适合您的用例;您没有计数。当您缺少每个键的乘法计数时,elements
是什么意思most_common
可能像写的那样工作,但它与频率无关在95%的情况下,我只会使用
collections.defaultdict(list)
(或任何适当的默认值),在其他5%的情况下,我会使用Counter
作为模型并实现我自己的版本(不计算特定的行为)相关问题 更多 >
编程相关推荐