318 votes

Double itération dans la compréhension de la liste

En Python, vous pouvez avoir plusieurs itérateurs dans une compréhension de liste, comme

[(x,y) for x in a for y in b]

pour des séquences a et b. Je suis au courant de la boucle imbriquée sémantique de Python interprétations de la liste.

Ma question est: Peut-on itérateur dans la compréhension reportez-vous aux autres? En d'autres termes: Pourrais-je avoir quelque chose comme ceci:

[x for x in a for a in b]

lorsque la valeur courante de la boucle externe est l'itérateur de l'intérieur?

Par exemple, si j'ai une liste imbriquée:

a=[[1,2],[3,4]]

quelle serait la compréhension de liste à l'expression de parvenir à ce résultat:

[1,2,3,4]

?? (Veuillez n'indiquer que la compréhension des réponses, car c'est ce que je veux savoir).

192voto

Cide Points 1901

Pour répondre à votre question avec votre propre suggestion:

 >>> [x for b in a for x in b] # Works fine
 

Pendant que vous demandiez des réponses sur la compréhension de la liste, permettez-moi également de souligner l'excellent itertools.chain ():

 >>> from itertools import chain
>>> list(chain.from_iterable(a))
>>> list(chain(*a)) # If you're using python < 2.6
 

148voto

ThomasH Points 6597

Eh bien, je suppose que j'ai trouvé la réponse: je ne me souciais pas assez de savoir quelle boucle est intérieure et quelle est extérieure. La liste de compréhension devrait être comme:

 [x for b in a for x in b]
 

pour obtenir le résultat souhaité, et oui, une valeur actuelle peut être l'itérateur de la prochaine boucle :-). Désolé pour le bruit.

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