Vamos a ver ejemplos de cómo realizar la tarea del conteo de vocales en un texto, desde dos perspectivas y adicional una manera de mejorar el resultado.
Enunciado del problema
Escribir una función que reciba un texto de entrada y como resultado, devuelva el conteo de las vocales existentes en el texto.
Solución 1
Para esta solución, vamos a realizar la iteración del texto, carácter por carácter, para validar si corresponde a una vocal. En caso de serlo realizaremos el respectivo conteo, de lo contrario lo omitiremos.
def countVowelsWithFor(text: str):
# Inicializamos un diccionario con las vocales todas con valor de cero
vowels = {v:0 for v in "aeiuo"}
# Recorremos el texto recibido caracter por caracter
for c in text:
# Validamos si el caracter es una vocal
# Usamos vowels.keys() para recuperar las claves del diccionario
# que corresponden a la lista de vocales ["a", "e", "i", "o", "u"]
if c in vowels.keys():
# Si el caracter es una vocal, incrementamos el conteo en 1
vowels[c] += 1
return vowels
De esta manera, si usamos el texto:
validando el conteo de vocales
obtendremos el siguiente resultado:
{'a': 3, 'e': 4, 'i': 1, 'o': 4, 'u': 0}
Solución 2
Para esta solución vamos a evitar realizar la iteración del texto con el ciclo for del caso anterior. En su lugar, vamos a utilizar un método definido en los objetos tipo str (string). El método count() permite recuperar la cantidad de coincidencias de una subcadena.
def countVowelsWithCount(text: str):
# Inicializamos un diccionario con las vocales todas con valor de cero
vowels = {v:0 for v in "aeiuo"}
# Recorremos el listado de vocales definidas en el diccionario
for v in vowels.keys():
# Usamos el método count() para recuperar la cantidad
# de repeticiones que existen en el texto recibido
# y asignamos el valor a la vocal correspondiente en el diccionario
vowels[v] = text.count(v)
return vowels
Con esto vamos a obtener el mismo resultado que en el caso anterior.
Observaciones
Hasta aquí hemos visto dos ejemplos de cómo contar las vocales existentes en un texto, pero aún tenemos algunos inconvenientes:
- Si las vocales son mayúsculas (A,E,I,O,U), no se las va a contar
- Si las vocales contienen acentos (á, é, í, ó, ú, ä…), tampoco las va a contar.
Para solventar esto debemos realizar un preprocesamiento del texto, para limpiarlo y dejarlo en una estructura que nos sirva, por ejemplo el texto:
Este es un gran día para programar en python
Queremos dejarlo limpio, quitando las mayúsculas y las tildes, así:
este es un gran dia para programar en python
Para esto, definiremos una función auxiliar que nos ayude a realizar el preprocesamiento del texto.
# Importamos la función normalize del paquete unicodedata
from unicodedata import normalize
def preprocessing(text: str):
# Realizamos la limpieza del texto con la función normalize
# Lo que nos ayudará a cambiar las vocales con acento por vocales normales
text = normalize('NFKD', text)
# Otro pao adicional que podemos realizar es la limpiez de caracteres especiales
# Para esto codificamos el texto como ascii
text = text.encode('ascii', 'ignore').decode("UTF-8")
# Finalmente convertimos el texto a minúsculas
text = text.lower()
return text
Ahora esta función podemos utilizarla en nuestras funciones de conteo anteriores. En este caso vamos a usar la segunda función, la cual quedaría de la siguiente manera:
def countVowelsWithCount(text: str):
# Realizamos el preprocesamiento del texto
text = preprocessing(text)
# Inicializamos un diccionario con las vocales todas con valor de cero
vowels = {v:0 for v in "aeiuo"}
# Recorremos el listado de vocales definidas en el diccionario
for v in vowels.keys():
# Usamos el método count() para recuperar la cantidad
# de repeticiones que existen en el texto recibido
# y asignamos el valor a la vocal correspondiente en el diccionario
vowels[v] = text.count(v)
return vowels
Realizada esta modificación ejecutamos el conteo con la frase propuesta "Este es un gran día para programar en python" obteniendo el siguiente resultado:
{'a': 6, 'e': 4, 'i': 1, 'u': 1, 'o': 2}
El cual difiere del resultado obtenido sin realizar el preprocesamiento, en donde tenemos solamente el conteo de 3 vocales e porque una es mayúscula y ninguna vocal i, porque esta tiene tilde:
{'a': 6, 'e': 3, 'i': 0, 'u': 1, 'o': 2}