【问题标题】:Why is there no symmetric difference for collections.Counter?为什么 collections.Counter 没有对称差异?
【发布时间】:2016-11-21 19:16:22
【问题描述】:

因此,对于集合,您可以做一个对称差 (^),这相当于联合减交。为什么 ^ 是 Counter 对象不受支持的操作数,而联合和交集仍然有效?

【问题讨论】:

  • 没有明确的答案。对此类问题的“通常”回答是,在设计模块时,没有人足够关心这个特殊情况来完成它的实施工作——后来也没有人足够关心它;-)

标签: python python-2.7 counter


【解决方案1】:

扩展我的评论,结果发现它当时被讨论过,被拒绝了。

单击完整消息(及其主题)的链接;我将仅引用 Raymond Hettinger 回复的“高阶位”:

我不太可能将这个 [对称差异] 方法添加到 Counter API,因为 用例的稀有性并不能保证增加的 API 复杂性。 IMO,添加这样的方法会使课程更难学习, 理解并记住。这似乎不是一场胜利 使用现有的替代方案:

...

我希望看到有人在 ASPN Cookbook 上发布一个子类 添加了许多有趣但不常见的操作。

...

Counter() 类抱负不高。这是一本字典 用零填充缺失值,并增加一些 管理计数的基本方法。

这里有完整的消息:

https://mail.python.org/pipermail/python-list/2010-August/585040.html

ASPN Cookbook 中还有一个在 Counter 子类中实现 __xor__ 的方法:

http://code.activestate.com/recipes/577362-extension-to-python-3-counter-class/

【讨论】:

【解决方案2】:

对于 Counter 对象,&| 并不像对集合那样表示交集和并集......它们的意思是 maxmin

提供了多种数学运算,用于组合 Counter 对象以生成多重集(计数大于零的计数器)。加法和减法通过增加或减少相应元素的计数来组合计数器。交集和并集返回相应计数的最小值和最大值。每个操作都可以接受带符号计数的输入,但输出将排除计数为零或更少的结果。

有了这些定义,^ 运算符是什么意思?

如果你想要密钥的对称差异,你可以做c1.viewkeys() ^ c2.viewkeys() 1


1在 python3.x 上,使用 .keys() 代替

【讨论】:

  • "^" 表示最大值减去最小值,如果唯一可能的多重性是 0 和 1,则这会简化为普通旧集合操作。这是传统的,但我很少看到它用于多组。这是一个一致的参考:oeis.org/wiki/Multisets#Generalized_set_operations
  • @TimPeters -- 酷。告诉雷蒙德继续这样做;-)。无论如何,我很确定这不是 OP 真正想要的......
  • Raymond 不会感兴趣 ;-) 但我敢打赌 OP 确实考虑到了这一点,因为他们写了“相当于联合减交集”。从这个意义上说,对称差异的定义方式与多重集和普通旧集相同。
猜你喜欢
  • 2017-05-26
  • 2015-06-04
  • 2011-06-11
  • 2011-02-13
  • 1970-01-01
  • 2012-12-20
  • 2016-10-03
  • 2011-03-01
  • 1970-01-01
相关资源
最近更新 更多