2012-07-09 3 views
6

dire che ho due liste:Python: Produrre lista che è una somma di due liste, voce-saggio

a=[1,2,3,4,5] 
b=[5,4,3,2,1] 

Voglio creare una terza che sarà somma lineare dei due data:

c[i]==a[i]+b[i] 
c==[6,6,6,6,6] 

E 'possibile fare con la 'per' il costruttore? Come:

c = [aa+bb for aa in a for bb in b] 

(che non restituisce, ovviamente, quello che voglio)

+0

Non sono stato io evidente quale sarebbe il risultato di assegnare a 'C', così ho provato in IDLE e incollato nel valore della' C' a scopo illustrativo. –

risposta

21

Uso zip():

>>> a = [1,2,3,4,5] 
>>> b = [5,4,3,2,1] 
>>> c = [x+y for x,y in zip(a, b)] 
>>> c 
[6, 6, 6, 6, 6] 

o:

>>> c = [a[i] + b[i] for i in range(len(a))] 
>>> c 
[6, 6, 6, 6, 6] 

c = [aa+bb for aa in a for bb in b] è qualcosa di simile:

for aa in a: 
    for bb in b: 
      aa+bb 

questo significa, selezionare 1 da a e poi scorrere tutti gli elementi della b mentre aggiungendoli al 1 e scegliere 2 da a e poi di nuovo un ciclo tra tutti i valori di b mentre aggiungendoli a 2, ecco perché non ti stavi aspettando un risultato.

+0

Sconfiggilo di 15 secondi. +1 e cancellerò il mio. – mgilson

+1

Scorri l'uso di 'for i in range (len (a))', usare gli iteratori è una pratica migliore. – PaulMcG

+1

Ha fatto un po 'di tempo, e dopo aver provato tutte le soluzioni su questo sito, il più veloce è stato 'starmap (add, zip (a, b))', con un clock a 0.65s. Le soluzioni di cui sopra erano 1,18 e 0,94 rispettivamente. –

-1

non so quello che stai cercando di fare, ma si può facilmente fare quello che hai chiesto con NumPy. Non sono sicuro che tu voglia davvero aggiungere quella dipendenza extra al tuo codice.

1
sums = [a[i]+b[i] for i in range(len(a))] 
+0

grazie per i - punti ... non so perché questo è esattamente quello che ha chiesto ... –

+0

Non è corretto. 'range()' accetta un numero intero, non un elenco: http://ideone.com/bnDMC. Dovresti usare invece len (a). – C0deH4cker

+0

oh sì, il tuo diritto ... stava scrivendo troppo velocemente ... corretto ... (ma è anche coperto di seguito nel post di Ashwini Chaudhary) –

2
[ay + be for ay, be in zip(a, b)] 
5
a=[1,2,3,4,5] 
b=[5,4,3,2,1] 

[x+y for x,y in zip(a,b)] 
[6, 6, 6, 6, 6] 

OR 

map(lambda x,y:x+y, a, b) 
[6, 6, 6, 6, 6] 
+0

+1 per 'map()'. –

+1

+1 per 'map()' con sequenze multiple, che implicitamente fa un 'izip_longest'. – PaulMcG