[Python] media di un generatore

Piergiuliano Bossi pgbossi a gmail.com
Mar 10 Dic 2013 23:15:23 CET


Ciao a tutti.

So che i generatori non hanno una lunghezza, infatti si possono usare per
modellare sequenze infinite. Volevo scrivere una funzione generica che
calcoli la media di una serie di valori, a prescindere dal fatto che questi
vengano da un generatore o siano iterabili.

Mi e' venuta cosi', spulciando qua e la'.

>>> def avg(gen):
...     x = itertools.izip(*((i, 1) for i in gen))
...     return float(sum(x.next())) / sum(x.next())
...
>>> avg(range(10))
4.5
>>> avg(range(15))
7.0
>>> avg([1, 4, 7,8])
5.0
>>> avg((1, 3, 4))
2.6666666666666665

Si puo' fare di meglio?

All'inizio pensavo di fare un'unica generator expression che si porti
dietro il conto dell'iterazione => qualcosa che consenta di esprimere il
fatto che la media di una serie di valori Xn puo' essere definita
ricorsivamente come segue (a meno di considerazioni sulla propagazione
degli errori che per il momento non mi interessano):
-) Avg(1) = X1
-) Avg(n) = (1 - 1/n) * Avg(n-1) + Xn/n

Ma alla fin fine mi sembra che il metodo di cui sopra sia sufficiente e
piu' semplice. Magari invece ci sono mille altri modi piu' pythonici e
migliori...

Feedback?

Ciao,
Giuliano


-- 
Piergiuliano Bossi
Blog: http://thinkingbox.wordpress.com/
Twitter: http://twitter.com/thinkingbox (English)
Twitter: http://twitter.com/scatolapensante (Italiano)
Google+: https://plus.google.com/u/0/108187981162465525118
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20131210/0201abda/attachment-0001.html>


Maggiori informazioni sulla lista Python