见下文,为什么执行=在我的原始计数器中吹掉一把钥匙?
>>> 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)]
我认为至少可以说这是不礼貌的,“X被统计0次”和“我们甚至不算Xs”之间存在很大差异.它看起来像集合.Counter根本不是一个计数器,它更像是一个multiset.
但是计数器是dict的子类,我们允许用零或负值构造它们:Counter(a = 0,b = -1).如果它实际上是“一包东西”,这不会被禁止,限制init接受可迭代的可迭代物品吗?
为了进一步混淆问题,counter实现更新和减去具有不同行为的方法和 – 运算符.看来这堂课正在发生身份危机!
反击是一个字典还是一个包?
解决方法:
从source;
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
似乎Counter实现为移除键,其总和为零非正键.由于默认值为零,并且源也为零,因此生成的dict不包含该键.
也许你可以通过更新获得相同的行为:
a.update(b)
似乎做你想要的.可能比较慢,__add__方法的手工制作实现会快得多.