Как проверить, включены ли все перечисленные ниже элементы?
Я обнаружил, что существует связанный с этим вопрос, как найти, существует ли хотя бы один элемент в списке:
Как проверить, есть ли один из следующих элементов в списке?
Но каков наилучший и питонический способ найти, существуют ли все элементы в списке?
Поиск по документам я нашел это решение:
>>> 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]