[Python] media di un generatore

Marco Chieppa | crap0101 crap0101 a riseup.net
Mer 11 Dic 2013 14:30:35 CET


Il giorno Tue, 10 Dec 2013 23:20:10 -0500
Piergiuliano Bossi <pgbossi a gmail.com> ha scritto:

> Pensiero malvagio:
> - con enumerate genero una serie di coppie (v, n)
> - le zippo e quindi ottengo 2 sequenze (v1, v2, ...) e (1, 2, ...) =>
> assumo di poter zippare le generator expression, oppure gia' qui sto
> sbagliando?
> - calcolo le somme di entrambe
> - sfrutto il fatto che sum(1, 2, ...) altri non e' che n * (n + 1) / 2, per
> cui divido sum(v1, v2, ...) per la soluzione positiva di n^2 + n - 2 *
> sum(1, 2, ...) = 0, cioe' 1/2 * (sqrt(8 * sum(1, 2, ..) + 1) - 1)
> 
> 
> Potrebbe funzionare, ma e' talmente assurdo che manco ci provo a vedere se
> sto toppando qualcosa. :)
> 

mhh... magari funziona però non mi sembra molto conveniente e
soprattutto leggibile stare a zippare e unzippare più del necessario.
Inoltre, invece di fare tutti quei calcoli con sqrt e altro, basta _non_
usare enumerate ma "simularlo" con una genexpr che yielda tuple di valori
della sequenza in uso e "uni" che poi sommi tra loro senza fare altre
operazioni, tipo così:

import itertools, operator

def avgfoo(seq):
  try:
    return operator.div(*map(sum, itertools.izip(*((x, 1.) for x in seq))))
  except TypeError:
    return 0

avgfoo(range(10)) # 4.5


che però oltre ad essere molto meno leggibile dovrebbe essere anche
(molto) meno efficiente e inutilmente complessa.






-- 
me -> http://crap0101.gnu-darwin.org/
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        signature.asc
Tipo:        application/pgp-signature
Dimensione:  836 bytes
Descrizione: non disponibile
URL:         <http://lists.python.it/pipermail/python/attachments/20131211/302e1f5a/attachment.pgp>


Maggiori informazioni sulla lista Python