web-dev-qa-db-fra.com

Compréhension des listes imbriquées avec deux listes

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

32
André Caldas

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

50
rspencer

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])
17
Wesley Baugh

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))]
10
Sticky
[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)).

3

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)
1
oleg