【问题标题】:Why Python collections Counter does not support subset & superset comparisons?为什么 Python 集合计数器不支持子集和超集比较?
【发布时间】:2018-01-15 08:07:29
【问题描述】:

此问题与:Python Counter Comparison as Bag-type

在 Python 3 中,比较两个计数器将导致“TypeError: unorderable types:Counter() > Counter()”。

对于 Python 中的集合,我们可以这样做: set1

【问题讨论】:

  • 子集/超集比较很容易用 Counters 来完成。例如,要检查c1 是否是c2 的子集,您可以执行not c1-c2all(c2[x] >= c1[x] for x in c1) 之类的操作。

标签: python comparator multiset


【解决方案1】:

计数器不是集合,它们是字典。你也不能比较字典:

>>> {1:1,2:2} < {1:1,2:2,3:3}
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    {1:1,2:2}<{1:1,2:2,3:3}
TypeError: unorderable types: dict() < dict()

【讨论】:

  • 嗨,马克,感谢您的回答/评论。实际上,正如我在问题中提到的,在 Python 2.7 中,通常可以在两个字典之间进行比较,特别是在两个计数器之间进行比较;但现在在 Python 3.X 中,这样的比较会产生 TypeError。我的问题是:从 Python 2.7 到 Python 3.X 的这种变化的逻辑/原因是什么?
  • @charlesqwu 一般来说,Python 3 中比较对象的规则比 Python 2 中的规则要严格得多。不过,我找不到任何关于 dicts 的具体内容。我怀疑这只是因为很难为一个字典小于另一个字典定义一个有用的规则。
【解决方案2】:

不幸的是,您是对的 - Python 的 collections.Counter 没有像 set 那样实现子集运算符 、>=,尽管它很容易实现它。 Python like this one 中的其他多集实现确实实现了它。

但是自己实现它相当容易。例如,这里有一个函数检查c1 &lt;= c2(c1 是 c2 的子集,或相等):

def is_subset(c1, c2):
    return all(c1[x] <= c2[x] for x in c1)

这个函数的作用是获取 c1 中的所有元素计数,并检查 c2 中是否也存在相同的元素 - 并且计数更大或相等。

【讨论】:

    猜你喜欢
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多