2012-07-09 5 views
6

Say Producir tengo dos listas:Python: Lista que es una suma de dos listas, punto-sabia

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

Quiero crear un tercero que será la suma lineal de dos que se incluyen:

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

¿Es posible hacer con 'for' constructor? Al igual que:

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

(que obviamente no Devuelve lo que quiero)

+0

No era yo obvio lo que sería el resultado de asignar a 'C', así que lo probamos en ralentí y pegar en el valor de 'C' con fines ilustrativos. –

Respuesta

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] es algo así como:

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

esto significa, seleccione 1 de a y luego bucle a través de todos los elementos de b al tiempo que añade a 1, y luego elegir 2 de a y luego de nuevo bucle a través de todos los valores de b al tiempo que añade a 2, por eso no estabas obteniendo el resultado esperado

+0

Batirme por 15 segundos. +1 y eliminaré el mío. – mgilson

+1

Debe desalentar el uso de 'for i in range (len (a))', usar iteradores es una mejor práctica. – PaulMcG

+1

Hice algunos 'timeit', y después de probar todas las soluciones en este sitio, el más rápido fue' starmap (add, zip (a, b)) ', ingresando a 0.65s. Las soluciones anteriores fueron 1.18s y 0.94s respectivamente. –

-1

No sé lo que estás tratando de hacer, pero puedes hacer fácilmente lo que has pedido con numpy. No estoy seguro de que realmente quieras agregar esa dependencia adicional a tu código.

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

gracias por los puntos ... no sé por qué esto es exactamente lo que pidió ... –

+0

Es incorrecto. 'range()' toma un número entero, no una lista: http://ideone.com/bnDMC. Deberías usar len (a) en su lugar. – C0deH4cker

+0

oh sí tu derecho ... estaba escribiendo demasiado rápido ... arreglado ... (pero también está cubierto a continuación en la publicación de 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 para 'map()'. –

+1

+1 para 'map()' con múltiples secuencias, lo que implícitamente hace un 'izip_longest'. – PaulMcG

Cuestiones relacionadas