obtener media

Arnau Sanchez pyarnau en gmail.com
Jue Jul 9 21:31:51 CEST 2009


Antonio Reyes wrote:

> hola, tengo el siguiente problema que espero me puedan orientar. tengo 
> una lista con un formato como el de abajo. lo que necesito hacer es 
> sumar todos los valores de una misma palabra y dividirlo entre el número 
> de líneas en las que aparece esa palabra. por ejemplo: 'aberration' 
> aparece en 3 líneas con valores distintos (2,3; 7,7; 8,7). el total de 
> estos valores es 34, la media de ellos sería 34/3, mientras que para 
> 'abrasion' sería 35/2 y para 'abutment' sería 9/1. tienen alguna idea de 
> cómo puedo resolverlo? gracias

Yo optaría por una solución funcional usando itertools.groupby y generadores. Si 
no estás familiarizado con este módulo el código puede parecerte algo críptico, 
pero el resultado es muy compacto. Por ejemplo:

#!/usr/bin/python
import itertools
import sys

def get_mean(inputlines):
     def _get_word(line):
         return line.split("[")[0]
     for word, linesiter in itertools.groupby(inputlines, _get_word):
         linesacc = [sum(map(int, line.split()[2:4])) for line in linesiter]
         yield word, float(sum(linesacc)) / len(linesacc)


for word, mean in get_mean(sys.stdin):
     print word, mean


El bucle final es sólo para que puedas usarlo como script. Si tus datos, por 
ejemplo, están en el fichero m.txt, podrías hacer:

$ python get_mean.py < m.txt
aberration 11.3333333333
abrasion 17.5
abruptness 10.6666666667
absoluteness 8.0
abutment 9.0


-- 
Desarrollador freelance
http://www.arnau-sanchez.com
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


Más información sobre la lista de distribución Python-es