vistas transitorio tipos modelo estructura crear campos calculados python list sum

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]