Я пытаюсь найти краткий способ узнать, есть ли в списке какой-либо из следующих пунктов, но моя первая попытка не работает. Помимо написания функции для этого, есть любой короткий способ проверить, есть ли один из нескольких элементов в списке.
>>> a = [2,3,4]
>>> print (1 or 2) in a
False
>>> print (2 or 1) in a
True
a = [1, 2] b = [3, 5, 2, 6, 8, 9] c = [3, 5, 6, 8, 1, 9] print( (1 and 2) in b ,(2 and 1) in b ,(1 and 2) in c ,(2 and 1) in c, sep='\n')
это правда ложь ложь правдаОтветы:
И пустые списки, и пустые наборы имеют значение False, поэтому вы можете напрямую использовать это значение в качестве истинного значения.
источник
any
может вернуться рано, как только найдетTrue
значение - ему не нужно сначала создавать весь списокАх, Тобиас, ты побил меня этим. Я думал об этом небольшом изменении вашего решения:
источник
x in long for x in short
противx in short for x in long
)a
иb
имеют одинаковую длину, максимальный и минимальный вернёт самый левый список, что делаетany()
вызов работать над тем же списком с обеих сторон. Если вы абсолютно требуют проверки длины в обратном порядке списков во втором вызове:any(x in max(a, b, key=len) for x in (b, a, key=len))
.any(x in max(a, b, key=len) for x in min(b, a, key=len))
(пропустил мин).Может быть, немного более ленивым
источник
any
может вернуться рано, тогда как ваша версия должна составить весь список из понимания, прежде чем егоany
можно будет использовать. @ user89788 ответ немного лучше, потому что двойные скобки не нужныПодумайте о том, что на самом деле говорит код!
Это должно объяснить это. :) По-видимому, Python реализует «ленивый или», что неудивительно. Он выполняет это примерно так:
В первом примере
x == 1
иy == 2
. Во втором примере все наоборот. Вот почему он возвращает разные значения в зависимости от их порядка.источник
Код гольф версии. Подумайте об использовании набора, если это имеет смысл. Я считаю это более читабельным, чем понимание списка.
источник
1 строка без списочных представлений.
источник
Лучшее, что я мог придумать:
источник
В Python 3 мы можем начать использовать распакованную звездочку. Дано два списка:
Изменить: включить предложение Алканена
источник
Когда вы думаете «проверить, если a в b», подумайте о хешах (в данном случае, устанавливает). Самый быстрый способ - хэшировать список, который вы хотите проверить, а затем проверять каждый элемент в нем.
Вот почему ответ Джо Коберга быстрый: проверка пересечения множества выполняется очень быстро.
Когда у вас мало данных, создание наборов может быть пустой тратой времени. Итак, вы можете составить список и просто проверить каждый элемент:
Когда количество предметов, которые вы хотите проверить, мало, разница может быть незначительной. Но сравните множество чисел с большим списком ...
Тесты:
скорость:
Непрерывно быстрый метод состоит в создании одного набора (из списка), но пересечение работает с большими наборами данных лучше всего!
источник
В некоторых случаях (например, уникальные элементы списка) могут использоваться операции над множествами.
Или, используя set.isdisjoint () ,
источник
Это будет сделано в одну строку.
источник
Я собрал несколько решений, упомянутых в других ответах и комментариях, а затем провел тест скорости.
not set(a).isdisjoint(b)
Оказалось, что он был самым быстрым, но когда результат был, он не сильно замедлилсяFalse
.Каждый из трех прогонов тестирует небольшой образец возможных конфигураций
a
иb
. Время в микросекундах.источник
Я должен сказать, что моя ситуация может быть не той, которую вы ищете, но она может предоставить альтернативу вашему мышлению.
Я пробовал как set (), так и any () метод, но все еще есть проблемы со скоростью. Итак, я вспомнил, что Рэймонд Хеттингер сказал, что все в python - это словарь и используй dict, когда можешь. Вот что я пытался.
Я использовал defaultdict с int для обозначения отрицательных результатов и использовал элемент в первом списке в качестве ключа для второго списка (преобразованного в defaultdict). Поскольку у вас есть мгновенный поиск с помощью dict, вы сразу же знаете, существует ли этот элемент в defaultdict. Я знаю, что вы не всегда можете изменить структуру данных для вашего второго списка, но если вы можете сделать это с самого начала, то это происходит намного быстрее. Возможно, вам придется преобразовать list2 (больший список) в defaultdict, где ключ - это потенциальное значение, которое вы хотите проверить из небольшого списка, а значение равно 1 (попадание) или 0 (без попадания, по умолчанию).
источник
Просто.
источник
a
в спискеb
.