[pyar] Una manera idiomatica de hacer esto

Alejandro Santos listas en alejolp.com
Lun Abr 22 12:40:42 ART 2013


2013/4/19 Jairo Trad <frodobolsonxx en gmail.com>:
> Buenas, les cuento que estoy con un problema y aunque tengo claro que tengo
> que hacer no tengo claro cual es la mejor manera de implementarlo. En
> particular es posible que el algoritmo se encuentre con un dataset muuuy
> grande y no quiero que se convierta en un agujero negro de recursos.
>
>
> Resulta que tengo una lista ordenada de pares [Fecha, Valor], puedo tener
> valores diferentes, con las mismas fechas y necesito que en caso de tener
> valores con fechas repetidas se saque un promedio de los valores y se deje
> un solo elemento con la fecha en cuestión. les dejo un ejemplo para que lo
> vean mas claro:
>
> esta lista:
>
> [ [datetime.datetime(2013, 4, 10, 12, 0), 23.4],
>   [datetime.datetime(2013, 4, 10, 12, 0), 25.81],
>   [datetime.datetime(2013, 4, 10, 12, 0), 25.08],
>   [datetime.datetime(2013, 4, 10, 13, 0), 18.49],
>   [datetime.datetime(2013, 4, 10, 14, 0), 20.74],
>   [datetime.datetime(2013, 4, 10, 14, 0), 25.86] ]
>
> deberia quedar asi:
>
> [ [datetime.datetime(2013, 4, 10, 12, 0), 25,03],
>   [datetime.datetime(2013, 4, 10, 13, 0), 18.49],
>   [datetime.datetime(2013, 4, 10, 14, 0), 23.3] ]
>
>

Me parece que está mal tu primer resultado. El promedio de una
secuencia debería ser la suma total dividida la cantidad de elementos.

>>> (23.4 + 25.81 + 25.08) / 3
24.763333333333332

Va otra más, usando itertools, reduce y map:

>>> def f(e):
...     M = list(e[1])
...     return (e[0], reduce((lambda a,b: a + b[1]), M, 0.0) / len(M))
...
>>> map(f, itertools.groupby(L, lambda x: x[0]))
[(datetime.datetime(2013, 4, 10, 12, 0), 24.763333333333332),
(datetime.datetime(2013, 4, 10, 13, 0), 18.49),
(datetime.datetime(2013, 4, 10, 14, 0), 23.299999999999997)]


--
Alejandro Santos



More information about the pyar mailing list