python - transitorio - tipos de campos odoo
Encontrar la suma de los componentes coincidentes en dos listas (5)
Use una lista de comprensión y zip
:
[a + b for (a,b) in zip(A,B)]
¿Son estas preguntas tarea? ¿O autoestudio?
Tengo dos listas:
A = [1, 2, 3, 4, 5]
B = [6, 7, 8, 9, 10]
Y necesito poder encontrar la suma de los enésimos términos de ambas listas, es decir, 1 + 6, 2 + 7, 3 + 8, etc.
¿Podría alguien decirme cómo hacer referencia a los elementos en ambas listas al mismo tiempo?
Leí en alguna parte que podría hacer Sum = a [i] + b [i] pero no estoy convencido de cómo funcionaría eso.
>>> import operator
>>> map(operator.add, A, B)
[7, 9, 11, 13, 15]
solo para demostrar la elegancia de Pythons :-)
Aunque la solución de Jazz funciona para 2 listas, ¿qué sucede si tiene más de 2 listas? Aquí hay una solución:
def apply_elementwise_function(elements_in_iterables, function):
elementwise_function = lambda x, y: itertools.imap(function, itertools.izip(x, y))
return reduce(elementwise_function, elements_in_iterables)
a = b = c = [1, 2, 3]
>>> list(apply_elementwise_function([a, b, c], sum))
[3, 6, 9]
Si sabe que las listas tendrán la misma longitud, podría hacer esto:
AB = [A[i] + B[i] for i in range(len(A))]
En Python 2, es posible que desee utilizar xrange
lugar de range
si sus listas son bastante grandes. Creo que es una forma explícita, simple, legible y obvia de hacerlo, pero algunos pueden diferir.
Si las listas pueden tener longitudes diferentes, debe decidir cómo desea manejar los elementos adicionales. Supongamos que quiere ignorar los elementos adicionales de la lista que sea más larga. Aquí hay tres formas de hacerlo:
AB = [A[i] + B[i] for i in range(min(len(A), len(B)))]
AB = map(sum, zip(A, B))
AB = [a + b for a, b in zip(A, B)]
La desventaja de usar zip
es que asignará una lista de tuplas, que puede ser una gran cantidad de memoria si sus listas ya son grandes. Usar for i in xrange
con subscripting no asignará toda esa memoria, o puede usar itertools.izip
:
import itertools
AB = map(sum, itertools.izip(A, B))
Si, por el contrario, quiere fingir que la lista más corta está rellenada con ceros, use itertools.izip_longest
es la respuesta más corta:
import itertools
AB = map(sum, itertools.izip_longest(A, B, fillvalue=0))
o
import itertools
AB = [a + b for a, b in itertools.izip_longest(A, B, fillvalue=0)]
Hola, puedes probar esto también:
>>>a=[1,2,3,4,5]
>>>b=[6,7,8,9,10]
>>>c=[]
>>>for i in range(0,5):
c.append(a[i]+b[i])
>>> c
[7, 9, 11, 13, 15]