Есть ли быстрый способ проверить, содержит ли один набор другой другой?
Что-то вроде:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
Есть ли быстрый способ проверить, содержит ли один набор другой другой?
Что-то вроде:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
Это списки, но если вы действительно имеете в виду множество, вы можете использовать метод issubset.
>>> s = set([1,2,3])
>>> t = set([1,2])
>>> t.issubset(s)
True
>>> s.issuperset(t)
True
Для списка вы не сможете сделать лучше, чем проверять каждый элемент.
Для полноты: это эквивалентно 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
Если вы подозреваете, что набор является подмножеством другого, и пересекаете эти два набора вместе, результат равен самому себе, если он является подмножеством.
a = [2,1,3,3]
b = [5,4,3,2,1]
set(a).intersection(set(b)) == set(a)
>>True
Вы можете использовать set.issubset()
или set.issuperset()
(или их операторные аналоги: <=
и >=
). Обратите внимание, что методы будут принимать любые итерируемые в качестве аргумента, а не только набор:
>>> {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
Ниже функция возвращает 0, если основной список не содержит подписок полностью и 1, если он полностью содержит.
def islistsubset(sublist,mainlist):
for item in sublist:
if item in mainlist:
contains = 1
else:
contains = 0
break;
return contains
>>> set([1,2,3]).issuperset(set([2,1]))
True
>>>
>>> set([1,2,3]).issuperset(set([3,5,9]))
False