Как проверить, включены ли все перечисленные ниже элементы?

Я обнаружил, что существует связанный с этим вопрос, как найти, существует ли хотя бы один элемент в списке:
Как проверить, есть ли один из следующих элементов в списке?

Но каков наилучший и питонический способ найти, существуют ли все элементы в списке?

Поиск по документам я нашел это решение:

>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False

Другим решением будет следующее:

>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False

Но здесь вы должны сделать больше ввода.

Есть ли другие решения?

Ответы

Ответ 1

Операторы типа <= в Python, как правило, не переоценивают, чтобы означать нечто значительно отличное от "меньше или равно". Это необычно для стандартной библиотеки - это пахнет старым API.

Используйте эквивалентный и более четко названный метод, set.issubset. Обратите внимание, что вам не нужно преобразовывать аргумент в набор; он сделает это для вас, если потребуется.

set(['a', 'b']).issubset(['a', 'b', 'c'])

Ответ 2

Я бы, вероятно, использовал set следующим образом:

set(l).issuperset(set(['a','b'])) 

или наоборот:

set(['a','b']).issubset(set(l)) 

Я нахожу его более читабельным, но он может быть убит. Наборы особенно полезны для вычисления объединений/пересечений/различий между коллекциями, но это может быть не лучший вариант в этой ситуации...

Ответ 3

Мне нравятся эти два, потому что они кажутся наиболее логичными, последний является более коротким и, вероятно, самым быстрым (показано здесь с использованием set буквального синтаксиса, который был перенесен в Python 2.7):

all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
#   or
{'a', 'b'}.issubset({'a', 'b', 'c'})

Ответ 4

Что делать, если ваши списки содержат дубликаты:

v1 = ['s', 'h', 'e', 'e', 'p']
v2 = ['s', 's', 'h']

Наборы не содержат дубликатов. Итак, следующая строка возвращает True.

set(v2).issubset(v1)

Чтобы подсчитать количество дубликатов, вы можете использовать код:

v1 = sorted(v1)
v2 = sorted(v2)


def is_subseq(v2, v1):
    """Check whether v2 is a subsequence of v1."""
    it = iter(v1)
    return all(c in it for c in v2) 

Итак, следующая строка возвращает False.

is_subseq(v2, v1)

Ответ 5

Это другой метод:

Код:

def isAll(lis1, lis2):
    list = []
    for i in lis2:
        for ii in lis1:
            if i == ii:
                    list.append(True)
            else:
                    list.append(False)

    if list.count(True) == len(lis1):
        return True
    else:
        return False

lis1 = ["a","b","c"]
lis2 = ["a","b"]

isAll(lis1, lis2) #Output: False  

Ответ 6

Это было то, что я искал в Интернете, но, к сожалению, нашел не в Интернете, а во время экспериментов с интерпретатором Python.

>>> case  = "caseCamel"
>>> label = "Case Camel"
>>> list  = ["apple", "banana"]
>>>
>>> (case or label) in list
False
>>> list = ["apple", "caseCamel"]
>>> (case or label) in list
True
>>> (case and label) in list
False
>>> list = ["case", "caseCamel", "Case Camel"]
>>> (case and label) in list
True
>>>

и если у вас есть длинный список переменных, хранящихся в переменной sublist variable

>>>
>>> list  = ["case", "caseCamel", "Case Camel"]
>>> label = "Case Camel"
>>> case  = "caseCamel"
>>>
>>> sublist = ["unique banana", "very unique banana"]
>>>
>>> # example for if any (at least one) item contained in superset (or statement)
...
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
False
>>>
>>> sublist[0] = label
>>>
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
True
>>>
>>> # example for whether a subset (all items) contained in superset (and statement)
...
>>> # a bit of demorgan law
...
>>> next((False for item in sublist if item not in list), True)
False
>>>
>>> sublist[1] = case
>>>
>>> next((False for item in sublist if item not in list), True)
True
>>>
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
True
>>>
>>>

Ответ 7

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

issublist = lambda x, y: 0 in [_ in x for _ in y]