2013-05-15 13 views
17

rozumiem jak działa prosty listowego np .:Zagnieżdżony listowego z dwóch list

[x*2 for x in range(5)] # returns [0,2,4,6,8] 

a także rozumiem, jak zagnieżdżona lista comprehesion działa:

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]] 

więc, gdy próbowałem zrobić to

l1 = [100,200,300] 
l2 = [0,1,2] 
[x + y for x in l2 for y in l1 ] 

spodziewałem to:

[101,202,303] 

ale mam to:

[100,200,300,101,201,301,102,202,302] 

więc mam lepszy sposób rozwiązania problemu, który dał mi to, co chcę

[x + y for x,y in zip(l1,l2)] 

ale nie rozumieć zwrot 9 elementy na pierwszym kodzie

Odpowiedz

30

Powodem, dla którego ma 9 liczb, jest to, że python traktuje

[x + y for x in l2 for y in l1 ] 

podobnie do

for x in l2: 
    for y in l1: 
     x + y 

znaczy, że jest to pętla zagnieżdżona

2
[x + y for x in l2 for y in l1 ] 

jest równoznaczne z:

lis = [] 
for x in l: 
    for y in l1: 
     lis.append(x+y) 

Więc dla każdego elementu l jesteś znowu iteracji l2 i znowu, jako l ma 3 elementy i l1 ma elementy, więc całkowite pętle są równe 9 (len(l)*len(l1)).

10

Wykazy list są równoważne pętli for-loop. Dlatego [x + y for x in l2 for y in l1 ] staną:

new_list = [] 
for x in l2: 
    for y in l1: 
     new_list.append(x + y) 

co następuje zip zwraca krotki zawierające jeden element z każdej listy. Dlatego [x + y for x,y in zip(l1,l2)] odpowiada:

new_list = [] 
assert len(l1) == len(l2) 
for index in xrange(len(l1)): 
    new_list.append(l1[index] + l2[index]) 
0

tej sekwencji

res = [x + y for x in l2 for y in l1 ]

jest równoważna

res =[] 
for x in l2: 
    for y in l1: 
     res.append(x+y) 
6

Powyższe odpowiedzi wystarczą za pytanie, ale chciałem, aby zapewnić Państwu rozwiń ze zrozumieniem listy dla odniesienia (widzisz, że to był twój początkowy kod i to, co próbujesz zrozumieć).

Zakładając, że długość obu listach są takie same, można zrobić:

[l1[i] + l2[i] for i in range(0, len(l1))] 
+0

Alternatywnie, można wyliczyć jedną z list, więc trzeba będzie tylko do indeksu jeden z nich. –