Есть ли быстрый способ проверить, содержит ли один набор полностью другой?
Что-то типа:
>>>[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()
не contains()
- person wikier; 12.07.2019
Для полноты: это эквивалентно issubset
(хотя, возможно, немного менее явно/читабельно):
>>> set([1,2,3]) >= set([2,1])
True
>>> set([1,2,3]) >= set([3,5,9])
False
Вы можете использовать либо 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
Один вариант остался нетронутым — вычитание:
>>> {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
A = set(a)
и B = set(b)
для вменяемости. Тогда это сравнение эффективно сводится к len(A.intersection(B)) == len(A)
. То есть сами наборы не должны сравниваться по элементам; нужно сравнивать только мощность этих наборов. Однако даже этой оптимизации, вероятно, недостаточно, чтобы сделать этот подход предпочтительным. Значительно более читаемые и эффективные подходы issubset()
и <=
почти наверняка нужны всем.
- person Cecil Curry; 09.02.2018
Ниже функция возвращает 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)
.
- person Iguananaut; 25.10.2017