Python计数器比较为袋型

Wil*_*eed 5 python comparison multiset python-collections

我需要Python中的bag / multiset-like数据类型。我了解collections.Counter通常用于此目的。但是比较运算符似乎不起作用:

In [1]: from collections import Counter

In [2]: bag1 = Counter(a=1, b=2, c=3)

In [3]: bag2 = Counter(a=2, b=2)

In [4]: bag1 > bag2
Out[4]: True
Run Code Online (Sandbox Code Playgroud)

对我来说,这似乎是一个错误。我期望小于和大于运算符执行类似集合的子集和超集比较。但是,如果真是这样,那bag1 > bag2将是错误的,因为bag2其中包含一个额外的'a'。Counter对象上似乎也没有子集/超集方法。所以我有两个问题:

  1. 计数器对象使用什么比较逻辑?
  2. 如何比较计数器对象的子集,超集,适当子集和适当超集?

Ste*_*ski 2

在 Python 2 上,比较会回退到字典的默认排序顺序Counter是 的子类dict)。

当且仅当它们的排序(键,值)列表比较相等时,映射(字典)才比较相等。[5] 除平等之外的结果得到一致解决,但没有另外定义。[6]

在 Python 3 上,比较会产生TypeError

当且仅当映射(字典)具有相同的(键,值)对时,它们才比较相等。顺序比较('<'、'<='、'>='、'>') raise TypeError

  • 它不会回退到默认顺序;它回落到[`__cmp__`的dict实现](http://hg.python.org/cpython/file/f17ab9fed3b0/Objects/dictobject.c#l1792),因为`Counter`继承自`dict`。 (5认同)