it-swarm.com.de

Verschachteltes Listenverständnis mit zwei Listen

Ich verstehe, wie das einfache Listenverständnis funktioniert:

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

und ich verstehe auch, wie das Erfassen von verschachtelten Listen funktioniert:

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

also, als ich das versuchte

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

Ich habe folgendes erwartet:

[101,202,303]

aber ich habe folgendes verstanden:

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

so habe ich einen besseren weg gefunden das problem zu lösen, der mir das gab was ich will

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

aber ich habe die Rückgabe von 9 Elementen im ersten Code nicht verstanden

32
André Caldas

Der Grund, warum es 9 Zahlen hat, ist, dass python behandelt

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

ähnlich zu

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

das heißt, es ist eine verschachtelte Schleife

50
rspencer

Listenverständnisse entsprechen for-Schleifen. Daher würde [x + y for x in l2 for y in l1 ] Werden:

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

Während Zip Tupel mit einem Element aus jeder Liste zurückgibt. Daher ist [x + y for x,y in Zip(l1,l2)] äquivalent zu:

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

Die obigen Antworten werden für Ihre Frage ausreichen, aber ich wollte Ihnen eine Lösung zum Listenverständnis als Referenz anbieten (da dies Ihr ursprünglicher Code war und Sie zu verstehen versuchen).

Wenn die Länge beider Listen gleich ist, können Sie Folgendes tun:

[l1[i] + l2[i] for i in range(0, len(l1))]
10
Sticky
[x + y for x in l2 for y in l1 ]

ist äquivalent zu :

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

Für jedes Element von l iterieren Sie also immer wieder l2, Da l 3 Elemente und l1 Elemente enthält, sodass die Gesamtanzahl der Schleifen 9 beträgt ( len(l)*len(l1)).

3

diese Sequenz

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

ist äquivalent zu

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