PDA

Ver la versión completa : Programadores de pytones, os necesito



peavy
10/08/2014, 21:10
Tras mes y pico de aprender Python por mi cuenta ha llegado el momento inevitable de preguntar algo que no soy capaz de encontrar por las redes :awesome:

El caso es que tengo una función muy sencilla que busca las veces que una palabra aparece en distintos textos y devuelve una string con el porcentaje de la palabra en cada texto.



def porciento(palabra):

textos=[text1,text2,text3,text4,text5,text6,text7,text8,te xt9]
resultado=' - '

for i in textos:
casos=i.count(palabra)
totalpalabras=len(i)
resultado=resultado + str(100 * casos / totalpalabras) + ' - '

return resultado


El problema es que quiero poder utilizar esta función con diferentes librerías que pueden contener cientos de textos, todos nombrados como text1,text2...textn. Mi idea es hacer un loop en el cual sólo tenga que cambiar un número (el número de textos en la librería) y que él solo me cree una lista bajo la variable 'textos'.

Algo así, pero que devuelva una llamada a una variable en vez de una string:



textos=[]

for i in numerodetextos:
textos.append('text'+str(i))
return textos

[Ahhh]

akualung
11/08/2014, 01:26
Primero de todo, matizar que de Python no he hecho más que las pequeñas prácticas que hice en el ciclo formativo y ya no recuerdo casi nada de ese lenguaje.

Si no he entendido mal, tú quieres hacer algo como esto no?




textos=[]

for x in range(1, numeroDeArchivos):
textos.append('text'+str(x))



¿O lo que quieres es evitar lo de tener que concatenar la cadena 'text' y el número? Por si era esto a lo que te referías, he encontrado este hilo en stackoverflow: http://stackoverflow.com/questions/6981495/how-can-i-concatenate-a-string-and-a-number-in-python

juanvvc
11/08/2014, 02:02
Vale, he tenido que leer unas 10 veces hasta que lo he entendido :D

Tú quieres algo como esto:



textos = [texto1, texto2, texto3]


Donde texto1, texto2, texto3 son variables, pero tu código genera algo como esto:



textos = ["texto1", "texto2", "texto3"]


Bueno, puedes transformar un array en el otro con este comando:



mylocals = locals()
textos = map(lambda i: mylocals[i], textos)


Ejemplo:


In [13]: texto1=5

In [14]: texto2=3

In [15]: textos=['texto1', 'texto2']

In [16]: print textos
['texto1', 'texto2']

In [17]: mylocals=locals()

In [18]: textos=map(lambda i: mylocals[i], textos)

In [19]: print textos
[5, 3]


De hecho tu función probablemente "debería" ser así:



textos=[]

for i in numerodetextos:
textos.append(locals()['text'+str(i)])
return textos


Fíjate que no metemos en la lista textos la cadena 'text'+stri(i), sino que vamos a las variables locales (locals()) y metemos en textos el valor de la variable local llamada 'text'+str(i)

Pero lo que quieres hacer es tan jodidamente raro que yo lo catalogo como error de diseño, y tendrías que escribir tu programa de una forma diferente. Por ejemplo: ¿para qué necesitas tener las variables texto1, texto2, texto3... como variables en vez de estar ya dentro de la lista textos?

peavy
11/08/2014, 05:14
Vale, he tenido que leer unas 10 veces hasta que lo he entendido :D

Tú quieres algo como esto:



textos = [texto1, texto2, texto3]


Donde texto1, texto2, texto3 son variables, pero tu código genera algo como esto:



textos = ["texto1", "texto2", "texto3"]




Eso es, la claridad no es lo mio :D Mañana lo probaré pero creo que tu solución es perfecta, gracias.




Pero lo que quieres hacer es tan jodidamente raro que yo lo catalogo como error de diseño

Probablemente, llevo pocos meses programando. El caso es que las variables textn contienen libros completos (novelas y cosas asi) y vienen de una libreria específica (nltk).