sobre listas

Chema Cortés ch3m4 en ch3m4.org
Mar Ago 19 13:29:11 CEST 2003


dvilla en gmx.net escribió:
> Hola:
> 
> Yo estoy más de acuerdo con Mikel. Partes de una lista de palabras:
> 
> 
>>>>listapal = ['hola','mundo','otra','vez']
> 
> 
> Si siquieres la letra más frecuente puedes concatenar todas las palabras en una
> sola:
> 
> 
>>>>todo = ''.join(listapal)
> 
> 
> Luego lo convertimos todo a ASCII (veremos porqué hago esto)
> 
> 
>>>>todo = map(ord, todo)
> 
> 
> Ahora calculamos la frecuencia de cada letra:
> 
> 
>>>>frec = map(todo.count, range(0, 255)) 
> 
>  # range() sólo admite enteros, por eso hice el ord().
> 
> Y ya está, el indice del mayor elemento de frec es la letra más repetida.
> 
> Aqui pongo el código completo:
> 
> 
> listapal = ['hola','mundo','otra','vez']
> 
> todo = map(ord, ''.join(listapal))
> 
> frec = map(todo.count, range(0, 255))
> 	
> letra = chr(frec.index(max(frec)))
> 
> print 'la letra mas repetida es "', letra, '"'
> 
> Puede parecer un poco confuso al principio pero si te habituas al map()
> practicamente no tienes que hacer for's para nada. Si alguien tiene alguna duda
> de cómo funciona esto que lo diga.

Es una solución bastante elegante. Tan sólo decirte un par de cosillas. 
Cuida con el range() que (aunque aquí no va a ser importante) no incluye 
el límite superior, o sea, debería ser range(0,256).

Y en cuanto al map(), ya hemos comentado alguna vez que se está dejando 
de usar en favor de la compresión de listas. Con compresión de listas no 
hubieras necesitado convertir la lista a códigos ascii:

listapal = ['hola','mundo','otra','vez']

todo = ''.join(listapal)

frec = [ todo.count(char(i)) for i in range(256) ]
	
letra = chr(frec.index(max(frec)))


Una solución algo más bestia, pero que también valdría para unicodes:

frec = [ todo.count(c) for c in todo ]
letra = todo[frec.index(max(frec))]




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