Je comprends comment fonctionne la simple compréhension de la liste, par exemple:
[x*2 for x in range(5)] # returns [0,2,4,6,8]
et je comprends aussi comment fonctionne la cohésion de la liste imbriquée:
w_list = ["i_have_a_doubt", "with_the","nested_lists_comprehensions"]
# returns the list of strings without underscore and capitalized
print [replaced.title() for replaced in [el.replace("_"," ")for el in w_list]]
donc, quand j'ai essayé de faire ça
l1 = [100,200,300]
l2 = [0,1,2]
[x + y for x in l2 for y in l1 ]
Je m'attendais à ça:
[101,202,303]
mais j'ai obtenu ceci:
[100,200,300,101,201,301,102,202,302]
donc j'ai eu une meilleure façon de résoudre le problème, ce qui m'a donné ce que je voulais
[x + y for x,y in Zip(l1,l2)]
mais je n'ai pas compris le retour de 9 éléments sur le premier code
La raison pour laquelle il a 9 chiffres est parce que python traite
[x + y for x in l2 for y in l1 ]
similaire à
for x in l2:
for y in l1:
x + y
c'est à dire, c'est une boucle imbriquée
Les compréhensions de liste sont équivalentes aux boucles for. Par conséquent, [x + y for x in l2 for y in l1 ]
Deviendrait:
new_list = []
for x in l2:
for y in l1:
new_list.append(x + y)
Alors que Zip
renvoie des tuples contenant un élément de chaque liste. Par conséquent, [x + y for x,y in Zip(l1,l2)]
est équivalent à:
new_list = []
assert len(l1) == len(l2)
for index in xrange(len(l1)):
new_list.append(l1[index] + l2[index])
Les réponses ci-dessus suffiront pour votre question mais je voulais vous fournir une solution de compréhension de liste pour référence (vu que c'était votre code initial et ce que vous essayez de comprendre).
En supposant que la longueur des deux listes est la même, vous pouvez faire:
[l1[i] + l2[i] for i in range(0, len(l1))]
[x + y for x in l2 for y in l1 ]
est équivalent à :
lis = []
for x in l:
for y in l1:
lis.append(x+y)
Donc, pour chaque élément de l
, vous répétez l2
Encore et encore, car l
a 3 éléments et l1
A des éléments donc le nombre total de boucles est égal à 9 ( len(l)*len(l1)
).
cette séquence
res = [x + y for x in l2 for y in l1 ]
est équivalent à
res =[]
for x in l2:
for y in l1:
res.append(x+y)