Я знаю, как использовать как для циклов, так и операторов if в отдельных строках, таких как:
>>> a = [2,3,4,5,6,7,8,9,0]
... xyz = [0,12,4,6,242,7,9]
... for x in xyz:
... if x in a:
... print(x)
0,4,6,7,9
И я знаю, что могу использовать понимание списка, чтобы объединить их, когда утверждения просты, такие как:
print([x for x in xyz if x in a])
Но чего я не могу найти, так это хорошего примера (для копирования и изучения), демонстрирующего сложный набор команд (не просто «print x»), которые выполняются после комбинации цикла for и некоторых операторов if. Что-то, что я ожидаю, выглядит так:
for x in xyz if x not in a:
print(x...)
Разве это не то, как Python должен работать?
python
loops
if-statement
for-loop
ChewyChunks
источник
источник
for
цикла иif
утверждения.x in a
медленно, еслиa
это список.Ответы:
Вы можете использовать выражения генератора следующим образом:
источник
gen = (y for (x,y) in enumerate(xyz) if x not in a)
возвращает >>>12
когда я печатаюfor x in gen: print x
- так почему неожиданное поведение с перечислением?for x in xyz if x:
for x in (x for x in xyz if x not in a):
работает для меня, но почему вы не можете просто быть в состоянии сделатьfor x in xyz if x not in a:
, я не уверен ...В соответствии с Zen of Python (если вам интересно, является ли ваш код "Pythonic", это то, что нужно):
Pythonic способ получения двух s:
sorted
intersection
set
Или те элементы, которые есть,
xyz
но не вa
:Но для более сложного цикла вы можете захотеть сгладить его, выполнив итерацию по имени генератора с хорошим именем и / или вызвав функцию с именем с хорошим именем. Попытка уместить все в одну строку редко бывает «питонической».
Обновите следующие дополнительные комментарии на ваш вопрос и принятый ответ
Я не уверен, что вы пытаетесь сделать
enumerate
, но еслиa
это словарь, вы, вероятно, хотите использовать ключи, например так:источник
Я лично думаю, что это самая красивая версия:
редактировать
если вы очень заинтересованы в том, чтобы избегать использования лямбды, вы можете использовать частичное применение функции и использовать модуль оператора (который обеспечивает функции большинства операторов).
https://docs.python.org/2/library/operator.html#module-operator
источник
filter(a.__contains__, xyz)
, Обычно, когда люди используют лямбду, им действительно нужно нечто гораздо более простое.__contains__
это метод, как и любой другой, только это специальный метод, то есть он может быть вызван косвенно оператором (in
в данном случае). Но он также может быть вызван напрямую, он является частью общедоступного API. Частные имена специально определены как имеющие не более одного завершающего подчеркивания, чтобы обеспечить исключение для специальных имен методов - и они подвергаются искажению имени, когда лексически в пределах классов. См. Docs.python.org/3/reference/datamodel.html#specialnames и docs.python.org/3.6/tutorial/classes.html#private-variables .in
она отправляется отдельно с правым операндом). Кроме того, обратите внимание, чтоoperator
также экспортируетcontains
метод под именем__contains__
, так что это, конечно, не личное имя. Я думаю, вам просто нужно научиться жить с тем фактом, что не каждое двойное подчеркивание означает «держаться подальше». : -]lambda
потребности исправить, чтобы включитьnot
:lambda w: not w in a, xyz
Ниже приведено упрощение / один вкладыш из принятого ответа:
Обратите внимание, что он
generator
был встроен . Это было проверено наpython2.7
иpython3.6
(обратите внимание на Parens вprint
;))источник
Я бы, вероятно, использовал:
источник
pythonic
Я могу кодировать функционально на любом другом языке, который я использую (scala, kotlin, javascript, R, swift, ..), но трудно / неловко в pythonисточник
import time a = [2,3,4,5,6,7,8,9,0] xyz = [0,12,4,6,242,7,9] start = time.time() print (set(a) & set(xyz)) print time.time() - start
if x in ignore: ...
.if set(a) - set(ignore) == set([]):
так что, возможно, именно поэтому это было намного медленнее, чем проверка членства. Я проверю это снова в будущем на гораздо более простом примере, чем то, что я пишу.Вы также можете использовать генераторы , если выражения генератора становятся слишком сложными или сложными:
источник
Используйте
intersection
илиintersection_update
пересечение :
intersection_update :
тогда
b
твой ответисточник
Мне понравился ответ Алекса , потому что фильтр оказывается в точности , если применяется к списку, так что если вы хотите , чтобы исследовать подмножество списка данного условия, это кажется самым естественным способом
этот метод полезен для разделения проблем, если функция условия изменяется, единственный код, который нужно возиться, это сама функция
Метод генератора кажется лучше, когда вам не нужны члены списка, но есть модификация упомянутых членов, которая кажется более подходящей для генератора
Также фильтры работают с генераторами, хотя в этом случае это неэффективно
Но, конечно, было бы неплохо написать так:
источник
Простой способ найти уникальные общие элементы списков a и b:
источник