4

set1 が set2 のサブセットであるかどうかをテストできることはわかっています。

{'a','b','c'} <= {'a','b','c','d','e'} # True

しかし、次のことも真です。

{'a','a','b','c'} <= {'a','b','c','d','e'} # True

セット内の要素が発生する回数を考慮して、次のようにするにはどうすればよいですか。

{'a','b','c'}     <= {'a','b','c','d','e'}      # True
{'a','a','b','c'} <= {'a','b','c','d','e'}      # False since 'a' is in set1 twice but set2 only once
{'a','a','b','c'} <= {'a','a','b','c','d','e'}  # True because both sets have two 'a' elements

私は次のようなことができることを知っています:

A, B, C = ['a','a','b','c'], ['a','b','c','d','e'], ['a','a','b','c','d','e']
all([A.count(i) == B.count(i) for i in A]) # False
all([A.count(i) == C.count(i) for i in A]) # True

set(A).issubset(B,count=True)しかし、もっと簡潔なようなものや、リスト内包表記から離れる方法があるのではないかと思っていました。ありがとう!

4

5 に答える 5

10

コメントに記載されているように、次を使用した可能な解決策Counter

from collections import Counter

def issubset(X, Y):
    return len(Counter(X)-Counter(Y)) == 0
于 2013-03-04T18:49:07.093 に答える
3

あなたの質問に対する簡単な答えは、セットの定義はこれらの操作を提供しないため、これを行うセット操作はありません。IE で探している機能を定義すると、データ型がセットではなくなります。

セットには、定義上、一意の順序付けされていないメンバーがあります。

>>> print {'a', 'a', 'b', 'c'}
set(['a', 'c', 'b'])
>>> {'a', 'a', 'b', 'c'} == {'a', 'b', 'c'}
True
于 2013-03-04T18:39:31.993 に答える
0

@DSM が彼のソリューションを削除したので、この機会に、拡張できるプロトタイプを提供します。

>>> class Multi_set(Counter):
    def __le__(self, rhs):
        return all(v == rhs[k] for k,v in self.items())


>>> Multi_set(['a','b','c']) <= Multi_set(['a','b','c','d','e'])
True
>>> Multi_set(['a','a','b','c']) <= Multi_set(['a','b','c','d','e'])
False
>>> Multi_set(['a','a','b','c']) <= Multi_set(['a','a','b','c','d','e'])
True
>>> 
于 2013-03-04T18:46:36.947 に答える