Compréhension de la liste Python pour les boucles
Je suis en train de lire le Python wikibook et se sentent confus au sujet de cette partie:
Compréhension de liste prend en charge plus d'une instruction for. Il
évaluer les éléments de tous les objets de façon séquentielle et en boucle
sur la plus courte des objets si un objet est plus longue que le reste.>>>item = [x+y for x in 'cat' for y in 'pot'] >>>print item ['cp', 'co', 'ct', 'ap', 'ao', 'at', 'tp', 'to', 'tt']
Je comprends l'utilisation des boucles for imbriquées, mais je n'ai pas
...et en boucle
sur la plus courte des objets si un objet est plus longue que le reste
Qu'est-ce que cela signifie? (plus court, plus long...)
source d'informationauteur ChandlerQ
Vous devez vous connecter pour publier un commentaire.
Ce type de boucles imbriquées créer un Produit Cartésien des deux séquences. Essayez-le:
La intérieure " x " dans la compréhension de liste ci-dessus (c'est à dire, la
for x in 'cat'
partie) est le même que le extérieurfor x in 'cat':
dans cet exemple:De sorte que l'effet de faire plus court ou plus long est le même que pour faire le " x " ou " y " boucle de plus de deux boucles imbriquées:
Dans chaque cas, la plus courte séquence est passée en boucle jusqu'à ce que la séquence plus longue est épuisé. Ceci contrairement
zip
où l'appariement serait résilié à la fin de la courte séquence.Modifier
Il semble y avoir confusion (dans les commentaires) à propos de boucles imbriquées rapport à zip.
Boucles Imbriquées:
Comme indiqué ci-dessus, ce:
est le même que deux imbriqués "pour" boucles " x " dans la boucle externe.
Boucles imbriquées exécutera l'intérieur
y
boucle de la gamme dex
dans la boucle externe de fois.Donc:
Vous pouvez obtenir le même résultat avec produit de itertools:
Zip est similaire mais s'arrête après la courte séquence est épuisé:
Vous pouvez utiliser itertools pour un zip qui zip jusqu'à la plus longue séquence est épuisé, mais le résultat est différent:
Bien, la documentation Python ne pas parler de ces courts/longs de cas: http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions. Avoir deux "pour" une compréhension de liste par deux boucles. L'exemple signalé par @drewk est correct.
Permettez-moi de le copier pour le bien de l'explication:
Dans les deux cas, le premier "pour" les formes de la boucle externe et le deuxième "pour" les formes de la boucle interne. C'est le seul invariant ici.