Python : 한 세트에 다른 세트가 완전히 포함되어 있는지 확인 하시겠습니까?


86

한 세트에 다른 세트가 완전히 포함되어 있는지 확인하는 빠른 방법이 있습니까?

다음과 같은 것 :

>>>[1, 2, 3].containsAll([2, 1])
True

>>>[1, 2, 3].containsAll([3, 5, 9])
False

답변:


131

그것들은 목록이지만 실제로 집합을 의미한다면 issubset 메서드를 사용할 수 있습니다.

>>> s = set([1,2,3])
>>> t = set([1,2])
>>> t.issubset(s)
True
>>> s.issuperset(t)
True

목록의 경우 각 요소를 확인하는 것보다 더 잘할 수는 없습니다.


3
나는이 대답 볼 때 나는 데자뷰의 이상한 느낌을 얻을
크리스토프 후씨

당신의 의미를 알고 있어야 issubset()하지 않습니다contains()
wikier

37

완전성을 위해 : 이것은 issubset(분명히 덜 명확하고 / 읽을 수 있지만 ) 다음과 동일합니다 .

>>> set([1,2,3]) >= set([2,1])
True
>>> set([1,2,3]) >= set([3,5,9])
False

문제는 a = set ([]) 및 b = set ([ 'a', 'b'])이고 a.issubset (b)는 True입니다
darkman

4

한 가지 옵션은 그대로 둡니다. 빼기 :

>>> {1, 2} - {1, 2, 3}
set([])
>>> {1, 2, 3} - {1, 2}
set([3])

기본적으로 첫 번째 목록의 요소가 두 번째 목록에 없는지 확인합니다.

누락 된 값을 보여줄 수 있기 때문에 매우 편리하다는 것을 알았습니다.

>>> def check_contains(a, b):
...     diff = a - b
...     if not diff:
...         # All elements from a are present in b
...         return True
...     print('Some elements are missing: {}'.format(diff))
...     return False
...
>>> check_contains({1, 2}, {1, 2, 3})
True
>>> check_contains({1, 2, 3}, {1, 2})
Some elements are missing: set([3])
False

4

set.issubset()또는 set.issuperset()(또는 연산자 기반 대응 : <=>=)을 사용할 수 있습니다 . 메소드는 세트뿐만 아니라 모든 iterable 을 인수로 허용 합니다 .

>>> {1, 2}.issubset([1, 2, 3])
True
>>> {1, 2, 3}.issuperset([1, 2])
True

그러나 연산자를 사용하는 경우 두 인수가 모두 설정되어야합니다.

>>> {1, 2} <= {1, 2, 3}
True
>>> {1, 2, 3} >= {1, 2}
True

4

집합이 다른 집합의 하위 집합으로 의심되고이 두 집합을 함께 교차하는 경우 하위 집합이면 결과는 자신과 동일합니다.

a = [2,1,3,3]
b = [5,4,3,2,1]
set(a).intersection(set(b)) == set(a)
>>True

1
하자 A = set(a)그리고 B = set(b)정신을 위해. 그러면이 비교는 효율적으로 len(A.intersection(B)) == len(A). 즉, 집합 자체를 요소별로 비교할 필요가 없습니다 . 이 세트의 카디널리티 만 비교하면됩니다. 그러나이 최적화조차도이 접근 방식을 선호하는 데 충분하지 않을 수 있습니다. 극적으로 더 읽기 효율성 issubset()<=접근 방법이 거의 확실 무엇 모두의 희망입니다.
Cecil Curry

@CecilCurry True-길이 측정이므로 '카디널리티'라는 단어를 잘못 사용했습니다. 문구를 업데이트했습니다. 귀하의 최적화는 내 오류로 인한 오류입니다. 최적화가 아닙니다. "intersection ()"의 리터럴 표현은 "> ="의 오버로드 된 의미보다 더 명시 적으로 읽고 "issubset ()"이 읽기가 더 쉽다고 말하는 것은 가장 인기있는 대답이기 때문에 명백한 것을 제거하는 것입니다. 다른 사람의 대답을 반복하는 것 이상으로 창의적인 솔루션에 자유롭게 기여하십시오.
요르단 Stefanelli

1
>>> set([1,2,3]).issuperset(set([2,1]))
True 
>>>    
>>> set([1,2,3]).issuperset(set([3,5,9]))
False

3
올바른 답을 형식화하고 설명을 추가하십시오.

0

아래 함수는 mainlist에 하위 목록이 완전히 포함되지 않은 경우 0을 반환하고 완전히 포함 된 경우 1을 반환합니다.

def islistsubset(sublist,mainlist):
     for item in sublist:
             if item in mainlist:
                     contains = 1
             else:
                     contains = 0
                     break;
     return contains

1
이것은 O (n ^ 2)이며 기존 답변 중 일부에서와 같이 집합 연산을 사용하는 것이 훨씬 빠릅니다. 이것은 또한 간단하게 작성할 수 있습니다 any(item in mainlist for item in sublist).
Iguananaut 2010 년

사실에 동의합니다. def islistsubset (sublist, mainlist) : contains = 1 for item in sublist : if item in mainlist : continue else : contains = 0 break; 반환 그래서 통화 당 2 과제 포함
Bobin은 Motti 토마스

@BobinMottiThomas 임시 변수를 만들지 않고 True 또는 False를 직접 반환 할 수 있습니다. list_a의 항목 : 항목 list_b에없는 경우 : 참 거짓 수익을 반환
요르단 Stefanelli
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.