2013-04-23 15 views
6

powiedzieć, że stworzenie listy podobnie jak w Pythonie:Chcesz znaleźć sposób robienia średnio wielu list

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

A potem chcę wziąć 1+1+2 i podzielić przez 3, dając mi średnią dla że element i zapisz na nowej liście. Chcę to powtórzyć dla drugich elementów, a na końcu dla trzeciego. Jak zrobić to zwięźle? (Nie mogę wymyślić inny sposób niż wielu pętlach.)

wyjście powinno być nową listę [(1+1+2), (2+3+4), (3+4+5)]

Dzięki tak dużo!

+0

możliwe duplikat [średnio listy list python] (http://stackoverflow.com/questions/10919664/averaging-list-of-lists-python) –

Odpowiedz

13

Średnie:

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

podsumowuje:

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

zwraca listę krotki, gdzie i-ta krotka zawiera i-ty element z każdej z sekwencji argumentów lub iterables.

gdy argumenty są już listy lub krotki ale muszą być rozpakowane do wywołania funkcji wymaga oddzielnych pozycyjnych argumentów ... pisać wywołanie funkcji z * -operator, aby rozpakować argumenty z listy lub krotki.

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

myślę chcesz ' zip (* l) 'w ostatniej linii. W przeciwnym razie po prostu uśredniacie każdą podlistę (otrzymacie 2, 2-2/3 i 3-2/3 zamiast 1-1/3, 3 i 4). – abarnert

Powiązane problemy