Python: посмотреть, содержит ли один набор другой - PullRequest
67 голосов
/ 04 мая 2010

Есть ли быстрый способ проверить, содержит ли один набор другой?

Что-то вроде:

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

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

Ответы [ 7 ]

106 голосов
/ 04 мая 2010

Это списки, но если вы действительно имеете в виду наборы, вы можете использовать метод issubset.

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

Для списка вы не сможете добиться большего успеха, чем проверка каждого элемента.

30 голосов
/ 04 мая 2010

Для полноты: это эквивалентно issubset (хотя, возможно, немного менее явно / читабельно):

>>> set([1,2,3]) >= set([2,1])
True
>>> set([1,2,3]) >= set([3,5,9])
False
4 голосов
/ 13 апреля 2016

Один вариант остается без изменений - вычитание:

>>> {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
3 голосов
/ 06 июня 2016

Если вы подозреваете, что набор является подмножеством другого, и пересекаете эти два набора вместе, результат равен самому себе, если он является подмножеством.

a = [2,1,3,3]
b = [5,4,3,2,1]
set(a).intersection(set(b)) == set(a)
>>True
1 голос
/ 13 февраля 2019

Вы можете использовать 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 голосов
/ 26 января 2018
>>> set([1,2,3]).issuperset(set([2,1]))
True 
>>>    
>>> set([1,2,3]).issuperset(set([3,5,9]))
False
0 голосов
/ 25 октября 2017

Функция ниже возвращает 0, если основной список не содержит полностью подсписок, и 1, если полностью содержит.

def islistsubset(sublist,mainlist):
     for item in sublist:
             if item in mainlist:
                     contains = 1
             else:
                     contains = 0
                     break;
     return contains
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...