-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に のサブセットではありませんbSetまた、collections.py のドキュメント コードを見ると、クラスのドキュメント文字列にあるように、これは非常に重要なことなので、少し心配です。

"""...
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。これは、セット内で値の重複が許可されていないためです。

ドキュメントはこれを明確にしています:

セット オブジェクトは、個別のハッシュ可能なオブジェクトの順序付けられていないコレクションです。

その文のキーワードは明確です。

したがって、3 つのセットがすべて互いに等しいことは簡単に確認できます。

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

いいえ。 の比較演算子setは壊れていません。 a確かに のサブセットですb。セットが構築されると、重複する値が削除されることを忘れないでください!

と を印刷してみるab、どちらもセットであることがわかります{1, 2}。実際、それらは同等のセットであるため、それぞれが他のサブセットです。


マルチセットを探している場合はcollections.Counter、データ構造を調べたいと思うかもしれません。ドキュメントには次のようにも記載されています。

Counter クラスは、他の言語のバッグまたはマルチセットに似ています。

カウンターは をサポートintersectionしているため、あるカウンターが別のカウンターのサブセットであるかどうかを簡単にテストできます。

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