한 세트에 다른 세트가 완전히 포함되어 있는지 확인하는 빠른 방법이 있습니까?
다음과 같은 것 :
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
답변:
완전성을 위해 : 이것은 issubset
(분명히 덜 명확하고 / 읽을 수 있지만 ) 다음과 동일합니다 .
>>> set([1,2,3]) >= set([2,1])
True
>>> set([1,2,3]) >= set([3,5,9])
False
한 가지 옵션은 그대로 둡니다. 빼기 :
>>> {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
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
집합이 다른 집합의 하위 집합으로 의심되고이 두 집합을 함께 교차하는 경우 하위 집합이면 결과는 자신과 동일합니다.
a = [2,1,3,3]
b = [5,4,3,2,1]
set(a).intersection(set(b)) == set(a)
>>True
A = set(a)
그리고 B = set(b)
정신을 위해. 그러면이 비교는 효율적으로 len(A.intersection(B)) == len(A)
. 즉, 집합 자체를 요소별로 비교할 필요가 없습니다 . 이 세트의 카디널리티 만 비교하면됩니다. 그러나이 최적화조차도이 접근 방식을 선호하는 데 충분하지 않을 수 있습니다. 극적으로 더 읽기 및 효율성 issubset()
과 <=
접근 방법이 거의 확실 무엇 모두의 희망입니다.
아래 함수는 mainlist에 하위 목록이 완전히 포함되지 않은 경우 0을 반환하고 완전히 포함 된 경우 1을 반환합니다.
def islistsubset(sublist,mainlist):
for item in sublist:
if item in mainlist:
contains = 1
else:
contains = 0
break;
return contains
any(item in mainlist for item in sublist)
.