2015-05-20 5 views

Antwort

17
A = [1,2,3] 
B = [4,5,6] 
C = [b_item for a_item, b_item in zip(A,B) for _ in range(a_item)] 
print C 

Ergebnis:

[4, 5, 5, 6, 6, 6] 

Diese ist eine einzeilige entspricht:

C = [] 
for a_item, b_item in zip(A,B): 
    for _ in range(a_item): 
     C.append(b_item) 

... was in etwa gleichwertig

ist
C = [] 
for i in range(min(len(A), len(B))): 
    a_item = A[i] 
    b_item = B[i] 
    for _ in range(a_item): 
     C.append(b_item) 

(N.B. Stolpern Sie nicht über den Unterstrich. It's an ordinary variable. Es wird üblicherweise verwendet, wenn Sie tatsächlich nicht auf den Wert der Variablen, wie in diesem Beispiel beziehen müssen)

+1

Könnten Sie dies für die erklären .. weniger pythonic geneigt Leute wie mich? Ich dachte 2 für Schleifen lol –

+0

@SterlingArcher, sicher. In gewisser Weise benutze ich _am_ zwei For-Schleifen. Ich habe sie beide in einen Ausdruck gezwängt. – Kevin

+0

Danke. Aber wie Sterling Archer sagte ... gibt es dafür eine einfache Logik? Obwohl das funktioniert. – sparrow

2

Meine Lösung:

C = sum([[B[i]]*A[i] for i in range(len(A))], []) 
print C 

Explaination:

[B[i]]*A[i] eine Liste erstellen mit A[i] Artikel von B[i]

[B[i]]*A[i] for i in range(len(A))] finden Sie eine Liste von Listen, zB [[4], [5, 5], [6, 6, 6]]

012 geben

sum(C, []) werden Liste der Listen in Liste konvertieren

+1

Ja, das funktioniert. 'sum (sequence, [])' ist ein wenig ineffizient, weil es mehrere Zwischenlisten erstellen muss, aber das ist keine große Sache, wenn C relativ klein ist. – Kevin

6

ich einen anderen Weg, es zu tun, mit einer anderen Idee liefern wird (nicht behaupten, er diese nutzen sollte, aber aus didaktischen Gründen)

finde ich recht ordentlich zu sein mit der Lage Elemente in python zu replizieren

[0]*3 # it means we create 3 elements of zero: [0,0,0] 

wenn ich diese einfach tun:

[[x]*i for i,x in zip(A, B)] 

ich Gruppen von Elementen:

[[4], [5, 5], [6, 6, 6]] 

Dann könnten wir itertools.chain, um wieder zu einer einzigen Liste verwenden:

from itertools import chain 
list(chain(*[[x]*i for i,x in zip(A, B)])) 
[4, 5, 5, 6, 6, 6] 
1

Einen anderen Weg:

C = [] 
for a, b in zip(A, B): 
    C.extend([b] * a) 

Aber ich die Liste Verständnis bevorzugen würde, nur ohne die lästigen _item, das heißt,

C = [b for a, b in zip(A, B) for _ in range(a)] 

oder die kürzere (aber für große Fälle langsam) Summe:

C = sum(([b] * a for a, b in zip(A, B)), []) 
Verwandte Themen