2013-04-23 8 views
6

dico di creare una lista in questo modo in Python:Vuoi trovare un modo di fare una media di più elenchi

[[1, 2, 3], [1, 3, 4], [2, 4, 5]] 

E poi voglio prendere 1+1+2 e dividere per 3, dandomi la media per quel elemento e memorizza in una nuova lista. Voglio farlo ancora per i secondi elementi e infine per il terzo. Come si farebbe in modo succinto? (Non riesco a pensare ad un modo diverso da cicli multipli.)

L'uscita dovrebbe essere un nuovo elenco [(1+1+2), (2+3+4), (3+4+5)]

Grazie mille!

+0

possibile duplicato di [elenco con una media di liste Python] (http://stackoverflow.com/questions/10919664/averaging-list-of-lists-python) –

risposta

13

Medie:

>>> data = [[1, 2, 3], [1, 3, 4], [2, 4, 5]] 
>>> from __future__ import division 
>>> [sum(e)/len(e) for e in zip(*data)] 
[1.3333333333333333, 3.0, 4.0] 

Somme:

>>> data = [[1, 2, 3], [1, 3, 4], [2, 4, 5]] 
>>> [sum(e) for e in zip(*data)] 
[4, 9, 12] 

restituisce un elenco di tuple, dove l'i-esima tupla contiene l'elemento i-esimo da ciascuna delle sequenze di argomenti o iterabili.

quando gli argomenti sono già in una lista o tupla, ma devono essere spacchettato per una chiamata di funzione che richiede argomenti posizionali separati ... scrivere la chiamata di funzione con la * -operatore per decomprimere gli argomenti da una lista o tupla.

>>> data 
[[1, 2, 3], [1, 3, 4], [2, 4, 5]] 

>>> zip(*data) 
[(1, 1, 2), (2, 3, 4), (3, 4, 5)] 
1
>>> l = [[1, 2, 3], [1, 3, 4], [2, 4, 5]] 
>>> zip(*l) 
[(1, 1, 2), (2, 3, 4), (3, 4, 5)] 
>>> def average(nums, default=float('nan')): 
... return sum(nums)/float(len(nums)) if nums else default 
... 
>>> [average(n) for n in zip(*l)] 
[2.0, 2.6666666666666665, 3.6666666666666665] 
+1

Penso che si desidera ' zip (* l) 'nella tua ultima riga. Altrimenti, stai calcolando la media di ogni sottolista (quindi ottieni 2, 2-2/3 e 3-2/3 invece di 1-1/3, 3 e 4). – abarnert

Problemi correlati