Saltar a contenido

Texto

Considere el siguiente texto sacado de una buena serie de televisión:

texto = '"Por qué será que en cuanto un hombre construye un muro, su
vecino inmediatamente quiere saber qué hay del otro lado" (Tyrion
Lannister). "Quien hace una pregunta debe ser capaz de soportar la
respuesta" (Yoren)'

Ejercicios

a. Cree la función texto_a_lista(texto) que reciba la variable texto y retorne una lista con las palabras que componen ese texto. Note que las letras en el resultado van en minúscula y no debe considerar los símbolos coma, punto, paréntesis y doble comillas.

>>> palabras = texto_a_lista_a(texto)
>>> print( palabras )
['por', 'qué', 'será', 'que', 'en', 'cuanto', 'un', 'hombre',
'construye', 'un', 'muro', 'su', 'vecino', 'inmediatamente', 'quiere',
'saber', 'qué', 'hay', 'del', 'otro', 'lado', 'tyrion', 'lannister',
'quien', 'hace', 'una', 'pregunta', 'debe', 'ser', 'capaz', 'de',
'soportar', 'la', 'respuesta', 'yoren']

b. Modifique la función texto_a_lista(texto) para que ahora retorne la lista de palabras ordenadas de acuerdo a largo (de mayor a menor).

>>> palabras = texto_a_lista_b(texto)
>>> print( palabras )
['inmediatamente', 'respuesta', 'lannister', 'construye', 'soportar',
'pregunta', 'vecino', 'tyrion', 'quiere', 'hombre', 'cuanto', 'yoren', 'saber', 'quien', 'capaz', 'será', 'otro', 'muro', 'lado', 'hace', 'debe', 'una', 'ser', 'qué', 'qué', 'que', 'por', 'hay', 'del', 'un', 'un', 'su', 'la', 'en', 'de']

c. Modifique la función texto_a_lista(texto) para que retorne la lista de palabras ordenadas según el número de veces que aparecen (de mayor a menor). Considere el siguiente ejemplo de ejecución del programa. Note que el resultado consta de la lista de palabras no repetidas que aparecen en el texto, indicando el número de veces que éstas aparecen.

>> palabras = texto_a_lista_c(texto)
>> print( palabras )
[[2, 'un'], [2, 'qué'], [1, 'yoren'], [1, 'vecino'], [1, 'una'], [1, 'tyrion'], [1,'su'], [1, 'soportar'], [1, 'será'], [1, 'ser'], [1,'saber'], [1, 'respuesta'], [1, 'quiere'], [1, 'quien'], [1, 'que'], [1, 'pregunta'], [1, 'por'], [1, 'otro'], [1, 'muro'], [1, 'lannister'], [1, 'lado'], [1, 'la'], [1, 'inmediatamente'], [1, 'hombre'], [1, 'hay'], [1, 'hace'], [1, 'en'], [1, 'del'], [1, 'debe'], [1, 'de'], [1, 'cuanto'], [1, 'construye'], [1, 'capaz']]

Solución
def texto_a_lista(texto):
    # Agregar un espacio al final del texto
    texto += ' '
    lista = []
    palabra = ''
    # Recorrer el texto
    for letra in texto:
        if letra == ' ': # Si la letra es un espacio
            lista.append(palabra.lower())
            palabra = '' # Limpiar la palabra
        else: # Si la letra no es un espacio
            if letra not in ',."()': # Evitar caracteres especiales
                palabra += letra
    return lista

def texto_a_lista_b(texto):
    palabras = texto_a_lista(texto)
    lista = [] # Lista para agregar los largos de las palabras
    for palabra in palabras:
        tmp = [len(palabra), palabra]
        lista.append(tmp)
    lista.sort()
    lista.reverse()
    salida = []
    for palabra in lista:
        salida.append(palabra[1])
    return salida

def texto_a_lista_c(texto):
    palabras = texto_a_lista(texto)
    sin_repetir = []
    for palabra in palabras:
        if palabra not in sin_repetir:
            sin_repetir.append(palabra)
    contador = []
    for palabra in sin_repetir:
        contador.append([palabras.count(palabra), palabra])
    contador.sort()
    contador.reverse()
    return contador

texto = '"Por qué será que en cuanto un hombre construye un muro, su vecino inmediatamente quiere saber qué hay del otro lado" (Tyrion Lannister). "Quien hace una pregunta debe ser capaz de soportar la respuesta" (Yoren)'

print(texto_a_lista(texto))
print(texto_a_lista_b(texto))
print(texto_a_lista_c(texto))