wim*_*wim 12 python counter dictionary multiset data-structures
见下文,为什么+=在我原来的柜台上吹掉一把钥匙?
>>> c = Counter({'a': 0, 'b': 0, 'c': 0})
>>> c.items()
[('a', 0), ('c', 0), ('b', 0)]
>>> c += Counter('abba')
>>> c.items()
[('a', 2), ('b', 2)]
Run Code Online (Sandbox Code Playgroud)
我认为至少可以说这是不礼貌的,"X被统计0次"和"我们甚至不算Xs"之间存在很大差异.它似乎collections.Counter根本不是一个反击,它更像是一个多重集.
但是计数器是dict的子类,我们允许用零值或负值构造它们:Counter(a=0, b=-1).如果它实际上是"一包东西",这不会被禁止,限制init接受可迭代的可迭代物品吗?
进一步混淆事项,对与操作员有不同行为的反制具update和subtract方法.看来这堂课正在发生身份危机!+-
反击是一个字典还是一个包?
Counters 是一种多重集合.从Counter()文档:
提供了几种数学运算来组合
Counter对象以产生多重集(计数大于零的计数器).加法和减法通过添加或减去相应元素的计数来组合计数器.交点和并集返回相应计数的最小值和最大值.每个操作都可以接受带有符号计数的输入,但输出将排除计数为零或更少的结果.
强调我的.
进一步说它告诉你给你一些关于Counters 的multiset性质的更多细节:
注意:计数器主要用于处理正整数以表示运行计数; 但是,注意不要不必要地排除需要其他类型或负值的用例.为帮助处理这些用例,本节介绍了最小范围和类型限制.
[...]
- multiset方法仅适用于具有正值的用例.输入可以是负数或零,但仅创建具有正值的输出.没有类型限制,但值类型需要支持加法,减法和比较.
所以,Counter对象是两种 ; 字典和包.但是,标准词典不支持添加,但是支持添加,Counter所以它不像是在Counter这里打破字典设置的优先级.
如果要保留零,请使用Counter.update()并传入Counter.elements()另一个对象的结果:
c.update(Counter('abba').elements())
Run Code Online (Sandbox Code Playgroud)
演示:
>>> c = Counter({'a': 0, 'b': 0, 'c': 0})
>>> c.update(Counter('abba').elements())
>>> c
Counter({'a': 2, 'b': 2, 'c': 0})
Run Code Online (Sandbox Code Playgroud)
从源头 ;
def __add__(self, other):
'''Add counts from two counters.
>>> Counter('abbb') + Counter('bcc')
Counter({'b': 4, 'c': 2, 'a': 1})
'''
if not isinstance(other, Counter):
return NotImplemented
result = Counter()
for elem, count in self.items():
newcount = count + other[elem]
if newcount > 0:
result[elem] = newcount
for elem, count in other.items():
if elem not in self and count > 0:
result[elem] = count
return result
Run Code Online (Sandbox Code Playgroud)
似乎Counter实现为移除键,其总和为零非正键.由于默认值为零,并且源也为零,因此生成的dict不包含该键.
也许你可以通过更新获得相同的行为:
a.update(b)
Run Code Online (Sandbox Code Playgroud)
似乎做你想要的.可能比较慢,手工制作的__add__方法实现速度会快得多.
| 归档时间: |
|
| 查看次数: |
1194 次 |
| 最近记录: |