2012-05-23 14 views
5

Esiste un modo più ragionevole per farlo? Voglio fare una nuova lista riassumendo gli indici di molte altre liste. Sono abbastanza nuovo per la programmazione e questo sembra un metodo molto goffo!Sommando gli elenchi in python - c'è un modo migliore?

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

In primo luogo, non creare 100 variabili denominate 'list1' ...; usa una lista di liste. – geoffspear

risposta

17

Questo è un caso di utilizzo piuttosto buono per 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 se hai i dati come una lista di liste, invece di liste separate:

>>> 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] 

Allo stesso modo, se si memorizzano i dati come dict di liste, è possibile utilizzare dict.itervalues() o dict.values() a recuperare i valori della lista e l'uso che in modo simile:

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

Nota che se i tuoi elenchi sono di lunghezza disuguale, zip funzionerà fino alla lunghezza più breve della lista. Per esempio:

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

Se si desidera ottenere un risultato che include tutti i dati, è possibile utilizzare itertools.izip_longest (con un appropriato fillvalue). Esempio:

>>> 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 molto elaborato – jamylak

+0

Grazie. Non avevo pensato di farlo in questo modo. Comunque, pensandoci ancora penso che quello di cui ho bisogno sia un dizionario, non una lista di liste --- Ho bisogno che ogni membro della lista sia facilmente accessibile all'utente. Cercherò di capire come fare quello che voglio come dizionario. – FakeDIY

+0

@FakeDIY se usi un 'dict', puoi ottenere l'elenco delle liste usando [' .itervalues ​​() '] (http://docs.python.org/library/stdtypes.html#dict.itervalues) oppure ['.values ​​()'] (http://docs.python.org/library/stdtypes.html#dict.values), ad es. '[somma (x) per x in zip (* dct.itervalues ​​())]' –

6

Mentre @ risposta di Shawn è corretta, questo è un caso in cui credo map potrebbe essere più elegante di list comprehension:

>>> 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

Sono d'accordo. Post correlati: http://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map –

0

Hai davvero bisogno di leggere un tutorial pitone.

  1. sum(list1) ti darà la somma di tale elenco.
  2. avete bisogno di imparare circa for loop
  3. Le tue liste devono essi stessi essere memorizzati in un elenco
  4. Il modo di ruotare un insieme di liste è quello di utilizzare 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] 
    

Per elaborare un elenco di liste come questo con zip, esaminare il modulo itertools o conoscere la sintassi *args.

1

Il problema in primo luogo è questo: si dovrebbe mai avere 100 variabili nel codice.

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] 

Invece, si dovrebbe avere qualcosa come

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]) 
... 

Poi devi calcolare il risultato voluto in questo modo:

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

Tuttavia, se i tuoi elenchi non sono tutti della stessa lunghezza, zip li ridurrà alla lunghezza della lista più piccola (ignorando il code). Quindi, dato che lo zip in pratica trasforma questo set in una matrice, se il tuo set è abbastanza grande, potresti star meglio usando una matrice numpy. –

+0

Sì, sembrava che tutti gli elenchi abbiano le stesse dimensioni, ma è importante sottolineare che il codice si basa su questa ipotesi, grazie. – bpgergo

+0

Il problema è che devo anche essere in grado di accedere a ciascuna lista individualmente e in modo user friendly. Penso di aver bisogno di un dizionario, non di una lista di liste. – FakeDIY

Problemi correlati