【发布时间】:2014-03-20 04:12:25
【问题描述】:
见下文,为什么+= 的实现会炸掉我原来的计数器中的一个键?
>>> 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”之间存在很大差异。似乎collections.Counter 根本不是一个计数器,它更像是一个多重集合。
但计数器是 dict 的子类,我们可以用零值或负值构造它们:Counter(a=0, b=-1)。如果它实际上是“一袋东西”,这不是被禁止的吗,限制 init 接受可哈希项的迭代?
为了进一步混淆问题,counter 实现了 update 和 subtract 方法,它们与 + 和 - 运算符具有不同的行为。看来这个班级有身份危机!
计数器是字典还是袋子?
【问题讨论】:
标签: python data-structures dictionary counter multiset