测试python Counter是否包含在另一个Counter中

enr*_*cis 7 python algorithm counter inclusion

如何使用以下定义测试python Counter是否包含在另一个中:

A计数器a是包含在计数器b,当且仅当,对于每一个键ka,该值a[k]小于或等于该值b[k].该Counter({'a': 1, 'b': 1})包含在Counter({'a': 2, 'b': 2}),但它不包含在Counter({'a': 2, 'c': 2}).

我认为这是一个糟糕的设计选择,但在Python 2.x中的比较操作符(<,<=,>=,>),不要使用以前的定义,所以第三计数器被认为大于第一.相反,在python 3.x中,Counter是一种不可共享的类型.

Blc*_*ght 11

虽然Counter实例<>运营商不具有可比性,但您可以找到与-运营商的不同之处.差异永远不会返回负数,因此如果A - B为空,则表示B包含所有项目A.

def contains(larger, smaller):
    return not smaller - larger
Run Code Online (Sandbox Code Playgroud)

  • 我考虑过给出这个答案,但我决定反对它,因为这不会造成短路,浪费了大量的时间和空间来构建计数器.此外,它必须遍历*两个*计数器,因为`-`处理第二个参数中的负计数.基于"all"的解决方案效率更高. (3认同)

enr*_*cis 9

我想出的最好的是转换我在代码中给出的定义:

def contains(container, contained):
    return all(container[x] >= contained[x] for x in contained)
Run Code Online (Sandbox Code Playgroud)

但是如果觉得奇怪的是python没有开箱即用的解决方案,我必须为每个操作员编写一个函数(或者创建一个通用的函数并传递比较函数).

  • 同意,鉴于 `Counter` 提供了几个类似多集的操作,令人惊讶的是它没有提供等效的 `subset of`。我希望能够做到`counter_a &lt;= counter_b` - 无论哪种方式,这对我来说似乎都是最好的解决方案。 (2认同)