349 votes

Manière pythonique de combiner une boucle FOR et une instruction IF

Je sais comment utiliser les boucles for et si les déclarations sur des lignes distinctes, telles que:

>>> 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

Et je sais que je peux utiliser une liste de compréhension de combiner ces lorsque les instructions sont simples, tels que:

print([x for x in xyz if x in a])

Mais ce que je ne peux pas trouver est un bon exemple de n'importe où (à copier et d'apprendre à partir de) la démonstration d'un ensemble complexe de commandes (pas juste "print x") qui se produisent à la suite d'une combinaison d'une boucle for et si certains états. Quelque chose que je m'attends ressemble:

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

Est-ce tout simplement pas la façon python est censé fonctionner?

416voto

Kugel Points 4595

Vous pouvez utiliser des expressions de générateur comme ceci:

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

for x in gen:
    print x
 

47voto

Johnsyweb Points 45395

Comme par Le Zen de Python (si vous vous demandez si votre code est "Pythonic", qui est l'endroit où aller):

  • La belle est mieux que laid.
  • Explicite est mieux qu'implicites.
  • Simple est mieux que complexe.
  • L'appartement est mieux que imbriqués.
  • La lisibilité des comptes.

Le Pythonic de manière à obtenir des sorted intersection deux sets est:

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

Ou les éléments qui sont xyz mais pas en a:

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

Mais pour une plus compliqué boucle vous pouvez aplatir par une itération sur un bien-nommé générateur d'expression et/ou l'appel à une fonction nommée. Essayer de tout faire rentrer sur une seule ligne est rarement "Pythonic".


Mise à jour des commentaires suivants à propos de votre question et de la accepté de répondre à

Je ne suis pas sûr de ce que vous essayez de faire avec enumerate, mais si l' a est un dictionnaire, vous voudrez probablement utiliser les touches, comme ceci:

>>> 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

22voto

Alex Points 3973

Personnellement, je pense que c'est la version la plus jolie:

 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
 

12voto

Wim Feijen Points 65

J'utiliserais probablement:

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

9voto

kracekumar Points 2653
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])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X