2012-05-23 18 views
5

¿Hay una manera más sensata de hacer esto? Quiero hacer una nueva lista sumando los índices de muchas otras listas. ¡Soy bastante nuevo en programación y esto parece un método muy torpe!Sumando listas en python: ¿hay alguna otra manera mejor?

list1 = [1,2,3,4,5] 
list2 = [1,1,1,4,1] 
list3 = [1,22,3,1,5] 
list4 = [1,2,5,4,5] 
... 
list100 = [4,5,6,7,8] 

i = 0 
while i < len(list1): 
    mynewlist[i] = list1[i]+list2[i]+list3[i]+list4[i]+...list100[i] 
    i = i+1 
+10

En primer lugar, no cree 100 variables con nombre 'list1' ...; usa una lista de listas – geoffspear

Respuesta

17

Este es un muy buen caso de uso para zip.

>>> list1 = [1,2,3,4,5] 
>>> list2 = [1,1,1,4,1] 
>>> list3 = [1,22,3,1,5] 
>>> list4 = [1,2,5,4,5] 
>>> [sum(x) for x in zip(list1, list2, list3, list4)] 
[4, 27, 12, 13, 16] 

o si tiene los datos como una lista de listas en lugar de listas separadas:

>>> data = [[1,2,3,4,5], [1,1,1,4,1], [1,22,3,1,5], [1,2,5,4,5]] 
>>> [sum(x) for x in zip(*data)] 
[4, 27, 12, 13, 16] 

Del mismo modo, si almacena los datos como un dict de listas, puede utilizar dict.itervalues() o dict.values() a recuperar los valores de la lista y el uso que de un modo similar:

>>> data = {"a":[1,2,3], "b":[3,4,4]} 
>>> [sum(x) for x in zip(*data.itervalues())] 
[4, 6, 7] 

Tenga en cuenta que si sus listas son de longitud desigual, zip funcionará hasta la longitud más corta de la lista. Por ejemplo:

>>> data = [[1,2,3,4,5], [1,1], [1,22], [1,2,5]] 
>>> [sum(x) for x in zip(*data)] 
[4, 27] 

Si desea obtener un resultado que incluye todos los datos, puede utilizar itertools.izip_longest (con una adecuada fillvalue). Ejemplo:

>>> data = [[1,2,3,4,5], [1,1], [1,22], [1,2,5]] 
>>> [sum(x) for x in izip_longest(*data, fillvalue=0)] 
[4, 27, 8, 4, 5] 
+3

+1 muy elaborado – jamylak

+0

Gracias. No había pensado en hacerlo así. Sin embargo, al pensarlo un poco más, creo que lo que necesito es un diccionario, no una lista de listas --- Necesito que cada miembro de la lista sea fácilmente accesible para el usuario. Trataré de averiguar cómo hacer lo que quiero como diccionario. – FakeDIY

+0

@FakeDIY si está usando un 'dict', puede obtener la lista de listas usando [' .itervalues ​​() '] (http://docs.python.org/library/stdtypes.html#dict.itervalues) o ['.values ​​()'] (http://docs.python.org/library/stdtypes.html#dict.values), por ej. '[sum (x) for x in zip (* dct.itervalues ​​())]' –

6

Si bien la respuesta de @ Shawn es correcta, este es un caso en el que creo map podría ser más elegante que las listas por comprensión:

>>> list1 = [1,2,3,4,5] 
>>> list2 = [1,1,1,4,1] 
>>> list3 = [1,22,3,1,5] 
>>> list4 = [1,2,5,4,5] 
>>> map(sum, zip(list1, list2, list3, list4)) 
[4, 27, 12, 13, 16] 
+1

Estoy de acuerdo. Publicación relacionada: http://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map –

0

Usted realmente necesita para leer un tutorial de Python.

  1. sum(list1) le dará la suma de esa lista.
  2. Usted necesita aprender sobre for bucles
  3. Sus listas deben estar a su vez almacenan en una lista
  4. La manera de girar una colección de listas es el uso de zip:

    list1 = [1,2,3,4,5] 
    list2 = [1,1,1,4,1] 
    list3 = [1,22,3,1,5] 
    zip(list1,list2,list3) 
    # matches up element n of each list with element n of the other lists 
    #=> [(1, 1, 1), (2, 1, 22), (3, 1, 3), (4, 4, 1), (5, 1, 5)] 
    # now you want to add up each of those tuples: 
    [sum(t) for t in zip(list1,list2,list3)] 
    #=> [3, 25, 7, 9, 11] 
    

Para trabaje una lista de listas como esta con zip, mire el módulo itertools u obtenga información sobre la sintaxis *args.

1

El problema en primer lugar es este: usted debe nunca tiene 100 variables en su código.

list1 = [1,2,3,4,5] 
list2 = [1,1,1,4,1] 
list3 = [1,22,3,1,5] 
list4 = [1,2,5,4,5] 
... 
list100 = [4,5,6,7,8] 

su lugar, debe tener algo como

list_of_lists = [] 
list_of_lists.append([1,2,3,4,5]) 
list_of_lists.append([1,1,1,4,1]) 
list_of_lists.append([1,22,3,1,5]) 
list_of_lists.append([1,2,5,4,5]) 
... 

Entonces será calcular el resultado deseado de esta manera:

[sum(x) for x in zip(*list_of_lists)] 
+1

Sin embargo, si tus listas no tienen la misma longitud, zip las cortará a la longitud de la lista más pequeña (ignorando el cruz). Entonces, dado que zip esencialmente convierte este conjunto en una matriz, si tu conjunto es lo suficientemente grande, es mejor que uses una matriz numpy. –

+0

Sí, parecía que todas las listas son del mismo tamaño, pero es importante destacar que el código se basa en esta suposición, gracias. – bpgergo

+0

El problema es que también necesito poder acceder a cada lista individualmente y de manera fácil de usar. Creo que necesito un diccionario, no una lista de listas. – FakeDIY

Cuestiones relacionadas