2015-05-20 11 views

Odpowiedz

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 

Wynik:

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

ten jest to odpowiednik jednej linii do:

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

... co jest z grubsza odpowiednikiem

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. Nie daj się zaskoczyć przez podkreślenie. It's an ordinary variable. To jest zwykle używany, gdy w rzeczywistości nie muszą odnosić się do wartości zmiennej, tak jak w tym przykładzie)

+1

mógłbyś wyjaśnić to dla .. mniej pythonic pochylonych ludzi takich jak ja? Myślałem o 2 pętlach lol –

+0

@SterlingArcher, na pewno. W pewnym sensie używam dwóch dla pętli. Po prostu wpakowałem ich obu w jedno wyrażenie. – Kevin

+0

Dzięki. Ale jak powiedział Sterling Archer ... czy jest jakaś prosta logika, aby to zrobić? Chociaż to działa. – sparrow

2

Moje rozwiązanie:

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

wyjaśnieniu:

[B[i]]*A[i] stworzy listę A[i] pozycje B[i]

[B[i]]*A[i] for i in range(len(A))] daje listę list np [[4], [5, 5], [6, 6, 6]]

sum(C, []) przekonwertuje listę list do listy

+1

Tak, to działa. 'suma (sequence, [])' jest mało wydajna pod względem pamięci, ponieważ musi tworzyć wiele list pośrednich, ale to nie jest wielka sprawa, jeśli C jest względnie mała. – Kevin

6

podam inny sposób to zrobić, stosując inny pomysł (nie twierdząc, powinien to wykorzystać, ale ze względów dydaktycznych)

znajdę dość schludny być zdolne do replikacji elementy w Pythonie przy użyciu

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

jeśli ja po prostu to zrobić:

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

otrzymuję grupy elementów:

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

Następnie możemy użyć itertools.chain wrócić do jednej listy:

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

Innym sposobem:

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

Ale wolałbym listę zrozumieniem, tylko bez uciążliwego _item, tj,

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

Lub krócej (ale dla dużych przypadkach wolno) Suma:

C = sum(([b] * a for a, b in zip(A, B)), []) 
Powiązane problemy