2013-12-17 10 views
6
outgoing=[ 
     [27, 42, 66, 85, 65, 64, 68, 68, 77, 58], 
     [24, 39, 58, 79, 60, 62, 67, 62, 55, 35], 
     [3, 3, 8, 6, 5, 2, 1, 6, 22, 23], 
     [3, 3, 8, 6, 5, 2, 1, 6, 22, 23], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     ] 
incoming=[ 
     [459, 469, 549, 740, 695, 629, 780, 571, 574, 599], 
     [420, 443, 504, 714, 669, 604, 745, 537, 537, 562], 
     [39, 26, 45, 26, 26, 25, 35, 34, 37, 37], 
     [26, 25, 27, 26, 26, 25, 35, 34, 37, 37], 
     [13, 1, 18, 0, 0, 0, 0, 0, 0, 0], 
     ] 

Voglio creare una lista che è la combinazione di entrata + uscita. E.g incoming[0][0] deve essere aggiunto a outgoing[0][0], incoming[0][1] deve essere aggiunto a outgoing[0][1] e così via. Verrà prodotto un elenco chiamato joint con la stessa struttura di incoming e outgoing (ad esempio un elenco di 5 elenchi di 10 elementi). Il codice che fa questo è il seguente:Python - Comprensione delle liste con 2 cicli for e un ADD e operando

joint=incoming 
for x in range(5): 
    for y in range(10): 
     joint[x][y]+=outgoing[x][y] 

Questo funziona correttamente. Ma mi piacerebbe come una lista di comprensione.

[[joint[x][y]+=outgoing[x][y]] for x in range(5) for y in range(10))] 

È possibile che questo non funziona, qualcuno può spiegare perché questo è fallito e dare un esempio di una lista corretta comprensione.

risposta

8

che si desidera utilizzare zip() qui per coniugare le vostre liste in coppie:

joint = [[x + y for x, y in zip(*row)] for row in zip(outgoing, incoming)] 

le coppie Outer Loop su per le righe da outgoing e incoming in coppie, in modo outgoing[0] insieme incoming[0], outgoing[1] con ingresso [1] `, ecc

il ciclo interno quindi coppie fino righe accoppiate, mettendo outgoing[0][0] e incoming[0][0] insieme in una tupla, seguita da outgoing[0][1] e incoming[0][1], e presto. Il ciclo interno produce una riga di valori sommati.

Demo:

>>> [[x + y for x, y in zip(*row)] for row in zip(outgoing, incoming)] 
[[486, 511, 615, 825, 760, 693, 848, 639, 651, 657], [444, 482, 562, 793, 729, 666, 812, 599, 592, 597], [42, 29, 53, 32, 31, 27, 36, 40, 59, 60], [29, 28, 35, 32, 31, 27, 36, 40, 59, 60], [13, 1, 18, 0, 0, 0, 0, 0, 0, 0]] 
>>> from pprint import pprint 
>>> pprint(_) 
[[486, 511, 615, 825, 760, 693, 848, 639, 651, 657], 
[444, 482, 562, 793, 729, 666, 812, 599, 592, 597], 
[42, 29, 53, 32, 31, 27, 36, 40, 59, 60], 
[29, 28, 35, 32, 31, 27, 36, 40, 59, 60], 
[13, 1, 18, 0, 0, 0, 0, 0, 0, 0]] 

tuo codice specifico non funziona perché non è possibile utilizzare le istruzioni di assegnazione (Enhanced o altro) all'interno di un'espressione. La parte += del tuo codice non può essere utilizzata in questo modo.

Un altro problema è che joint era solo un altro riferimento alla incoming, non una copia. Hai modificato la stessa lista con un riferimento diverso ad essa.

5

avete bisogno di qualcosa come

joint = [[sum(x) for x in zip(a, b)] for a, b in zip(incoming, outgoing)] 

Il tuo elenco di comprensione tentato non funziona perché cerca di assegnare al joint[x][y] prima che la struttura di joint (vale a dire l'elenco delle liste) sia configurato. Il tuo codice precedente funziona perché è incoming (nota: non una copia, è un riferimento allo stesso oggetto), quindi la struttura è lì.

3

In primo luogo appiattire entrambe le liste utilizzando un nested loop-comprensione e quindi utilizzare il built-in zip() la funzione in-congiunzione con i map() e sum() funzioni

in modo da provare questo:

flattend1 = [k for i in outgoing for k in i] 
flattend2 = [k for i in incoming for k in i] 

print map(sum,zip(flattend1,flattend2)) 
Problemi correlati