python – 添加计数器删除键

见下文,为什么执行=在我的原始计数器中吹掉一把钥匙?

>>> 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__方法的手工制作实现会快得多.

上一篇:C#-非布尔值“真值表”的创建


下一篇:STLのset与multiset