La meilleure source d'information est le tutoriel officiel Python sur les compréhensions de listes . Les compréhensions de liste sont presque les mêmes que les boucles for (certainement n'importe quelle compréhension de liste peut être écrite comme une boucle for) mais elles sont souvent plus rapides que l'utilisation d'une boucle for.
Regardez cette liste plus longue de compréhension du tutoriel (le if
filtre la compréhension, seules les parties qui passent l'instruction if sont transmises à la partie finale de la compréhension de la liste (ici (x,y)
) :
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
C'est exactement la même chose que cette boucle for imbriquée (et, comme le dit le tutoriel, notez que l'ordre de for et if est le même).
>>> combs = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
Les principaux différence entre une compréhension de liste et une boucle for est que la partie finale de la boucle for (où vous faites quelque chose) vient au début plutôt qu'à la fin.
J'en viens à vos questions :
Quel type d'objet doit être utilisé pour utiliser cette structure de boucle ?
Un site itérable . Tout objet qui peut générer un ensemble (fini) d'éléments. Il s'agit notamment de tout conteneur, liste, ensemble, générateur, etc.
Quel est l'ordre dans lequel i et j sont affectés aux éléments de l'objet ?
Ils sont assignés exactement dans le même ordre qu'ils sont générés à partir de chaque liste, comme s'ils étaient dans une boucle for imbriquée (pour votre première compréhension, vous obtiendriez 1 élément pour i, puis chaque valeur de j, 2e élément dans i, puis chaque valeur de j, etc.)
Peut-on le simuler par une structure de boucle for différente ?
Oui, déjà montré ci-dessus.
Cette boucle for peut-elle être imbriquée avec une boucle for de structure similaire ou différente ? Et comment cela se présenterait-il ?
Bien sûr, mais ce n'est pas une bonne idée. Ici, par exemple, on vous donne une liste de listes de personnages :
[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]