Python: посмотреть, содержит ли один набор другой?

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

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

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

>>>[1, 2, 3].containsAll([3, 5, 9])
False
вопрос задан 4.05.2010
Nick Heiner
45469 репутация

6 ответов


  • 90 рейтинг

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

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

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

    ответ дан danben, с репутацией 58402, 4.05.2010
  • 25 рейтинг

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

    >>> set([1,2,3]) >= set([2,1])
    True
    >>> set([1,2,3]) >= set([3,5,9])
    False
    
    ответ дан ChristopheD, с репутацией 76129, 4.05.2010
  • 4 рейтинг

    Возможно, излишнее, но другой вариант: Если вы пересекаете два набора, а результирующий набор содержит все уникальные записи вашего подмножества кандидатов, тогда набор кандидатов действительно является подмножеством.

    Другими словами: Если мощность рассматриваемого множества равна результирующей мощности его множества, пересекаемого другим множеством, то оно является подмножеством этого множества.

    a = [2,1,3,3]
    b = [5,4,3,2,1]
    set(a).intersection(set(b)) == set(a)
    >>True
    
    ответ дан Jordan Stefanelli, с репутацией 691, 6.06.2016
  • 2 рейтинг

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

    >>> {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
    
    ответ дан Artem Skoretskiy, с репутацией 341, 13.04.2016
  • 0 рейтинг

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

    def islistsubset(sublist,mainlist):
         for item in sublist:
                 if item in mainlist:
                         contains = 1
                 else:
                         contains = 0
                         break;
         return contains
    
    ответ дан Bobin Motti Thomas, с репутацией 1, 25.10.2017
  • 0 рейтинг
    >>> set([1,2,3]).issuperset(set([2,1]))
    True 
    >>>    
    >>> set([1,2,3]).issuperset(set([3,5,9]))
    False
    
    ответ дан Mamata, с репутацией 1, 26.01.2018