Питонический способ комбинирования цикла FOR и 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?

7 Solutions collect form web for “Питонический способ комбинирования цикла FOR и IF”

Вы можете использовать генераторные выражения следующим образом:

 gen = (x for x in xyz if x not in a) for x in gen: print x 

В соответствии с Zen Python (если вам интересно, является ли ваш код «Pythonic», это место для игры):

  • Красиво лучше, чем уродливое.
  • Явный лучше, чем неявный.
  • Простой лучше, чем сложный.
  • Плоский лучше, чем вложенный.
  • Показатели удобочитаемости.

Питоновский способ получения sorted intersection двух set s:

 >>> sorted(set(a).intersection(xyz)) [0, 4, 6, 7, 9] 

Или те элементы, которые являются xyz но не в:

 >>> sorted(set(xyz).difference(a)) [12, 242] 

Но для более сложного цикла вы можете сгладить его, итерации по выраженному выражению генератора и / или выходу на хорошо названную функцию. Попытка вместить все на одной линии редко «Pythonic».


Обновление после дополнительных комментариев по вашему вопросу и принятого ответа

Я не уверен, что вы пытаетесь сделать с enumerate , но если это словарь, вы, вероятно, захотите использовать ключи, например:

 >>> a = { ... 2: 'Turtle Doves', ... 3: 'French Hens', ... 4: 'Colly Birds', ... 5: 'Gold Rings', ... 6: 'Geese-a-Laying', ... 7: 'Swans-a-Swimming', ... 8: 'Maids-a-Milking', ... 9: 'Ladies Dancing', ... 0: 'Camel Books', ... } >>> >>> xyz = [0, 12, 4, 6, 242, 7, 9] >>> >>> known_things = sorted(set(a.iterkeys()).intersection(xyz)) >>> unknown_things = sorted(set(xyz).difference(a.iterkeys())) >>> >>> for thing in known_things: ... print 'I know about', a[thing] ... I know about Camel Books I know about Colly Birds I know about Geese-a-Laying I know about Swans-a-Swimming I know about Ladies Dancing >>> print '...but...' ...but... >>> >>> for thing in unknown_things: ... print "I don't know what happened on the {0}th day of Christmas".format(thing) ... I don't know what happened on the 12th day of Christmas I don't know what happened on the 242th day of Christmas 

Я лично считаю, что это самая красивая версия:

 a = [2,3,4,5,6,7,8,9,0] xyz = [0,12,4,6,242,7,9] for x in filter(lambda w: w in a, xyz): print x 

редактировать

если вы очень заинтересованы в том, чтобы избегать использования лямбда, вы можете использовать приложение с частичными функциями и использовать операторский модуль (который обеспечивает функции большинства операторов).

https://docs.python.org/2/library/operator.html#module-operator

 from operator import contains from functools import partial print(list(filter(partial(contains, a), xyz))) 
 a = [2,3,4,5,6,7,8,9,0] xyz = [0,12,4,6,242,7,9] set(a) & set(xyz) set([0, 9, 4, 6, 7]) 

Я бы, вероятно, использовал:

 for x in xyz: if x not in a: print x... 

Вы также можете использовать генераторы , если выражения генератора становятся слишком сложными или сложными:

 def gen(): for x in xyz: if x in a: yield x for x in gen(): print x 

Использовать intersection или intersection_update

  • пересечение :

     a = [2,3,4,5,6,7,8,9,0] xyz = [0,12,4,6,242,7,9] ans = sorted(set(a).intersection(set(xyz))) 
  • intersection_update :

     a = [2,3,4,5,6,7,8,9,0] xyz = [0,12,4,6,242,7,9] b = set(a) b.intersection_update(xyz) 

    то b – ваш ответ

  • Разделить длинные условные выражения на строки
  • если оператор с двумя условиями в Python
  • Могу ли я использовать механизм «как» в выражении if
  • игра в блэкджек python, похоже, игнорирует оператор «if»
  • Ошибка повторения синтаксиса Python
  • Python - оператор Weird IF при использовании вложенных списков
  • Как можно упростить это очень длинное if-заявление?
  • Что более «питоновское» для «не»
  • Python - лучший язык программирования в мире.