-3

这是我使用的代码:

>>> a = set([1,2,2])
>>> b = set([1,1,2])
>>> a
    {1, 2, 2}
>>> b
    {1, 1, 2}
>>> a <= b
    True 
>>> a.__le__(b)
    True

显然a不是 的子集b。另外,查看 collections.py 中的文档代码,我有点担心,因为这是至关重要的,就像Set我们让他们说的类的文档字符串一样

"""...
To override the comparisons (presumably for speed, as the
semantics are fixed), all you have to do is redefine __le__ and
then the other operations will automatically follow suit."""

所有其他方法都使用__le__. 所以我一个人在这个吗?

4

2 回答 2

7

实际上a是 的一个子集b。这是因为集合中不允许有重复值。

文档清楚地说明了这一点:

集合对象是不同的可散列对象的无序集合。

那句话中的关键词是distinct

因此,可以很容易地验证,您的三组都彼此相等。

{1, 2, 2} == {1, 2}
{1, 1, 2} == {1, 2}
于 2013-02-13T13:58:10.850 回答
6

不,比较运算符 forset绝对没有损坏。 a肯定是 的一个子集b。不要忘记,当您的集合构建时,重复的值将被删除!

如果您尝试打印aand b,您会发现它们都是 set: {1, 2}。事实上,它们是等价的集合,因此每个都是另一个的子集。


如果你正在寻找一个多重集,也许你想collections.Counter为你的数据结构寻找一个。文档甚至指出:

Counter 类类似于其他语言中的 bag 或 multisets。

由于 Counters 支持intersection,您可以轻松测试一个计数器是否是另一个计数器的子集:

def counter_issubset(a,b):
    return a == (a & b)
于 2013-02-13T13:58:23.720 回答