Я обнаружил, что есть связанный вопрос о том, как определить, существует ли хотя бы один элемент в списке:
как проверить, есть ли один из следующих элементов в списке?
Но каков наилучший и питонический способ узнать, все ли элементы существуют в списке?
Просматривая документы, я нашел это решение:
>>> 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
Но здесь вам нужно больше печатать.
Есть ли другие решения?
set(smaller) <= set(larger)
?Ответы:
Такие операторы, как
<=
в Python, обычно не переопределяются для обозначения чего-то существенно отличного от «меньше или равно». Это необычно для стандартной библиотеки - для меня это пахнет устаревшим API.Используйте эквивалентный метод с более понятным названием
set.issubset
. Обратите внимание, что вам не нужно преобразовывать аргумент в набор; при необходимости он сделает это за вас.источник
<=
иissubset
означает то же самое. Почему тебе это не нравится?<=
означает набор, не просматривая его в документации или не имея предварительных знаний о том, что это означает в теории множеств, тогда как все знают, чтоissubset
означает автоматически.Я бы, наверное, использовал
set
следующим образом:или наоборот:
Я считаю, что это немного более читабельно, но может быть чрезмерным. Наборы особенно полезны для вычисления объединения / пересечения / различий между коллекциями, но это может быть не лучший вариант в этой ситуации ...
источник
MySet.issubset(MyOtherSet)
иMySet <= MyOtherSet
такие же.<=
имеет значение, которое он имеет для последовательностей: можно было бы ожидать, что это означает «подпоследовательность», а не лексикографическое упорядочение.<=
с последовательностями тоже кажется странным, как-то ...set(['a','a']).issubset(['a'])
возвращаетсяTrue
.Мне нравятся эти два, потому что они кажутся наиболее логичными, последний из которых короче и, вероятно, самый быстрый (показан здесь с использованием
set
буквального синтаксиса, который был перенесен на Python 2.7):источник
Что делать, если в ваших списках есть такие дубликаты:
Наборы не содержат дубликатов. Итак, следующая строка возвращает True.
Для подсчета дубликатов вы можете использовать код:
Итак, следующая строка возвращает False.
источник
Это было то, что я искал в Интернете, но, к сожалению, нашел не в Интернете, а во время экспериментов с интерпретатором Python.
и если у вас есть длинный список переменных, хранящихся в
sublist variable
источник
Пример того, как это сделать с помощью лямбда-выражения:
источник
Не в случае OP, но - для всех, кто хочет утверждать пересечение в dicts и оказался здесь из-за плохого поиска в Google (например, я) - вам нужно работать с
dict.items
:Это потому что
dict.items
возвращает кортежи пар ключ / значение, и, как и любой объект в Python, они взаимозаменяемы.источник