Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

[Sugerencia] Respuesta alternativa a el desafío 9 del curso Python para Data Science: Trabajar con funciones, estructuras de datos y excepciones.

Dict Comprehension

9 - Una empresa tiene sucursales distribuidas en los estados de la región Sudeste de Brasil. En una de las tablas de registro de las sucursales, hay una columna que contiene la información de a qué estado pertenece: estados =['CMX', 'OAX', 'PUE', 'PUE', 'CMX', 'PUE', 'OAX', 'OAX', 'OAX', 'CMX', 'CMX', 'PUE', 'OAX', 'CMX', 'VER', 'PUE', 'VER', 'CMX', 'PUE', 'CMX', 'OAX', 'CMX', 'PUE'].

La empresa siempre está abriendo nuevas sucursales, por lo que la tabla está constantemente recibiendo nuevos registros y al gerente le gustaría tener la información actualizada de la cantidad de sucursales en cada estado.

A partir de la columna con la información de los estados, crea un diccionario utilizando la comprensión de diccionarios (dict comprehension) con la clave siendo el nombre de un estado y el valor siendo la cantidad de veces que aparece el estado en la lista.

Consejo: Puedes hacer un paso intermedio para generar una lista de listas en la que cada una de las listas tenga el nombre de solo un estado con valores repetidos.

Solución recomendada del instructor:

# Almacenando los estados sin repetición de valor
estados_unicos = list(set(estados))

# Creando una lista de listas con valores repetidos de cada estado
lista_de_listas = []
for estado in estados_unicos:
    lista = [e for e in estados if e == estado]
    lista_de_listas.append(lista)
print(lista_de_listas)

# Creando un diccionario en el que la clave es el nombre de cada estado único y el valor es la cantidad de elementos
conteo_valores = {estados_unicos[i]: len(lista_de_listas[i]) for i in range(len(estados_unicos))}
print(conteo_valores)

Solución propuesta por mi: Se elimina el paso intermedio de creación de una lista con valores unicos y repetidos:

# Diccionario en donde se almacenará un estado dentro de la lista estados
# y como valor del diccionario el numero de ocurrencia dentro de la misma lista 
# usando el metodo count()

informacion_actualizada = {estado: estados.count(estado) for estado in estados}

print(informacion_actualizada)
2 respuestas

Hola Fabian, espero que estés bien

Tu solución propuesta para el desafío 9 es bastante ingeniosa y directa. Al utilizar el método count(), logras simplificar el proceso al evitar el paso intermedio de crear listas de valores únicos y repetidos. Esto hace que tu código sea más limpio y fácil de entender. Aquí tienes un ejemplo de cómo tu solución funciona:

estados = ['CMX', 'OAX', 'PUE', 'PUE', 'CMX', 'PUE', 'OAX', 'OAX', 'OAX', 'CMX', 'CMX', 'PUE', 'OAX', 'CMX', 'VER', 'PUE', 'VER', 'CMX', 'PUE', 'CMX', 'OAX', 'CMX', 'PUE']

informacion_actualizada = {estado: estados.count(estado) for estado in estados}

print(informacion_actualizada)

Este código generará un diccionario con el conteo de sucursales en cada estado, como se esperaba. Sin embargo, ten en cuenta que al iterar sobre estados, estás contando varias veces el mismo estado, lo cual puede ser ineficiente para listas muy grandes. Aunque en este caso específico no es un problema significativo, es algo a considerar en escenarios con grandes volúmenes de datos.

Espero que esta explicación te ayude a entender mejor tu propia solución y te anime a seguir explorando diferentes enfoques para resolver problemas de programación.

¡Buenos estudios y cordial saludos!

Me parece muy interesante y practico analizar la complejidad de ambas soluciones así que me di a la tarea: Codigo 1:

estados = ['CMX', 'OAX', 'PUE', 'PUE', 'CMX', 'PUE', 'OAX', 'OAX', 'OAX', 'CMX', 'CMX', 'PUE', 'OAX', 'CMX', 'VER', 'PUE', 'VER', 'CMX', 'PUE', 'CMX', 'OAX', 'CMX', 'PUE']

informacion_actualizada = {estado: estados.count(estado) for estado in estados}

print(informacion_actualizada)

La creación de la lista inicial realmente no genera mucha diferencia en la complejidad del código así que vamos a obviarla, al igual que la función print y la creación del diccionario. Enfocándonos en lo importante: dict comprehension, primero tenemos el bucle sobre "estados" que al contener n elementos hace que itere n veces sobre la lista, por lo tanto tenemos una complejidad O(n). También tenemos el uso del método "count()" el cual según la documentación de Python en GitHub, tiene una complejidad de O(n) Objects/listobject.c , Esto nos daría una complejidad de O(n x n) = O(n^{2}), bastante ineficiente a decir verdad, mi solución propuesta sin utilizar "Counter" de la librería collector (ya que así se podría tener una solución con O(n), la más rápida posible ) sería:

estados = ['CMX', 'OAX', 'PUE', 'PUE', 'CMX', 'PUE', 'OAX', 'OAX', 'OAX', 'CMX', 'CMX', 'PUE', 'OAX', 'CMX', 'VER', 'PUE', 'VER', 'CMX', 'PUE', 'CMX', 'OAX', 'CMX', 'PUE']

informacion_actualizada = {estado: estados.count(estado) for estado in set(estados)}

print(informacion_actualizada)

Lo que hice fue utilizar el método "set()" para cambiar el n por un k, donde k < n ya que no pueden haber más elementos únicos que los elementos en si de la lista, siendo iguales en el peor de los casos O(n^{2}) con esto se logra una complejidad de O(n x k), siendo esta la misma complejidad que la solución propuesta por el instructor, Gracias por la corrección Brenda!!