Estructuras en Python, cuál usar
Python ofrece diferentes estructuras para el almacenamiento y manipulación de datos. En este artículo compararemos las características y usos de cada estructura para aprender a seleccionar la más conveniente para cada situación.
En Python podemos encontrarnos con diferentes estructuras de datos como listas(list), tuplas(tupla), conjuntos(set) y diccionarios(dict). Aunque todas ellas permiten en almacenamiento de datos múltiples cada una de ellas tiene características únicas que limitan cómo podemos utilizarlas.
- Estructuras ordenadas/no ordenadas: Un estructura es ordenada si los elementos tienen un orden fijo, esto permite que la estructura pueda recorrerse y obtener los elementos en el mismo orden.
- Estructuras modificables/fijas: Una estructura modificable tiene valores que pueden ser sobrescritos por otros después de su creación mientras que una estructura fija no puede modificar sus valores una vez creados.
- Estructuras con valores duplicados/únicos: Algunos tipos de estructuras permite contener valores repetidos mientras que otras solo contienen valores únicos.
- Estructuras indexables/no indexables: Una estructura es indexable si es posible acceder o referenciar a los elementos por su posición o índice.
Estas características varían en las estructuras de Python:
Tipo | Nombre | Ordenado | Modificable | Duplicado | Indexable |
Lista | list | SI | SI | SI | SI |
Tupla | tuple | SI | NO | SI | SI |
Conjunto | set | NO | SI | NO | NO |
Diccionario | dict | SI (desde 3.7) | SI | Claves únicas | SI(Por clave) |
Listas
Las listas son estructuras de datos ordenadas, modificables y que permiten elementos duplicados. Para definir una lista utilizamos corchetes.
numeros = [10, 20, 30, 40, 20, 30]
Debido a que es una estructura ordenada es posible recorrer sus elementos:
for n in numeros:
print(n)
y ya que es una estructura indexada es posible recorrerla utilizando sus índices o posiciones:
for i in range(2, 5): #Recorre desde la posición 2 a la posición 5
print(print(n))
El índice puede ser utilizado para obtener el valor correspondiente a una posición:
print(numeros[0])
Una vez creada la lista (vacía o con elementos) es posible modificarla agregando, eliminando y sobreescribiendo elementos.
#Insertar elemento al final de la lista
numeros.append(50)
#Insertar elemento en una posición específica
numeros.insert(2, 15) #Agrega el elemento 15 en la posición 2
#Insertar varios elementos
numeros.extend([60, 70])
#Eliminar elemento por valor
numeros.remove(30) #Elimina el primer elemento con valor 30
#Eliminar elemento por posición
numeros.pop(0)
#Eliminar todos los elementos
numeros.clear()
#Sobreescribir valor por posición
numeros[1] = 25
El orden de los elementos en la lista puede ser modificado utilizando algunas de las configuraciones de la función sort
. En este artículo se cubren el ordenamiento de listas con sort en más detalle.
numeros.sort()
Cuándo utilizar listas
SI | NO |
Los elementos deben almacenarse en orden Los valores cambian durante la ejecución El orden de los elementos es relevante Pueden existir datos duplicados Es útil acceder por índice Es necesario ordenar, filtrar y recorrer los valores Se construye una colección de manera incremental | Los valores son fijos Es necesario evitar duplicados La posición no es suficiente para identificar un valor Es necesario hacer búsquedas por valor rápidas |
Tuplas
Las tuplas son estructuras de datos ordenadas, indexadas, no modificables y que permiten valores duplicados, lo que significa que mantiene el orden de los elementos de su creación pero no puede ser modificado.
numeros = (10, 20, 30, 40, 20 , 30)
Ya que es indexable es posible acceder al valor de un elemento utilizando su posición:
print(numeros[2])
Al ser ordenadas e indexadas pueden recorrerse tanto por valor como por índice:
#Recorrer por valor
for n in numeros:
print(n)
#Recorrer por índice
for n in numeros[2:5]:
print(n)
Ya que las tuplas no son modificables no es posible agregar, eliminar o sobreescribir valores ni modificar su orden.
Cuándo utilizar tuplas
SI | NO |
Los valores no cambian durante la ejecución Es necesario mayor rendimiento al recorrer y acceder Los valores son referencias fijas de otros elementos | Los valores deben modificarse Se necesita ordenar o filtrar los datos Es necesario evitar duplicados La posición no es suficiente para identificar un valor |
Conjuntos
Los conjuntos o sets son una estructura desordenada de elementos únicos que permite ser modificada.
numeros = {10, 20, 30, 40}
Debido a que no está ordenado (y por lo tanto tampoco indexado) no se puede acceder a un valor utilizando su posición. Por la misma razón no es posible recorrer los valores por índice aunque si es posible hacerlo por valor. Al no estar ordenados, la salida de los valores puede variar cada vez que se ejecuta.
for n in numeros:
print(n)
Es posible agregar y eliminar elementos pero ya que es una estructura no ordenada no puede especificarse la posición.
#Agregar un elemento
numeros.add(50)
#Agregar varios elementos
numeros.update([60, 70])
#Eliminar un valor (genera error si el valor no existe)
numeros.remove(20)
#Eliminar un valor (no genera error si el valor no existe)
numeros.discard(100)
#Eliminar un elemento aleatorio
numeros.pop()
#Vacía el conjunto
numeros.clear()
Operaciones de conjuntos
Los conjuntos o sets permiten realizar matemáticas entre colecciones de elementos únicos similares a las de teorías de conjuntos.
Nombre | Operación | Resultado |
Unión | a | b o a.union(b) | Elementos de a más de los b |
Intersección | a & b o a.intersection(b) | Elementos que están en a y b |
Diferencia | a - b o a.difference(b) | Elementos de a que no están en b |
Diferencia simétrica | a ^ b o a.symmetric_difference(b) | Elementos exclusivos de cada conjunto |
Subconjunto | a <= b o a.issubset(b) | True si a está contenido en b |
Superconjunto | b >= a o b.issuperset(a) | True si a contiene a b |
Disjuntos | a.isdisjoint(b) | True si no comparten elementos |
Cuándo utilizar conjuntos
SI | NO |
Es necesario evitar duplicados Se necesitan hacer operaciones de conjuntos | Es importante el orden de los elementos Es necesario acceder a los elementos por índice |
Diccionarios
Los diccionarios son estructuras de datos modificables que almacena los elementos en pares clave-valor. Desde Pyhton 3.7 lo diccionarios mantienen el orden en el que se han creado los elementos.
persona = {"nombre": "María", "edad": 30, "país": "Argentina"}
Es posible obtener un valor tanto por clave o por valor.
# Obtener valor por clave
print(persona["nombre"])
# Obtener por valor
print(persona.get("edad"))
De manera similar es posible recorrer un diccionario obteniendo claves, valores o los pares clave-valor.
# Recorrer obteniendo claves y valores
for clave, valor in persona.items():
print(f"{clave}: {valor}")
# Recorrer solo valores
for valor in persona.values():
print(valor)
# Recorrer solo claves
for clave in persona.keys():
print(clave)
Los diccionarios son modificables por lo que es posible agregar, modificar y eliminar elementos.
# Agregar nuevo elemento
persona["profesion"] = "Ingeniera"
# Eliminar elemento por clave
del persona["ciudad"]
# Eliminar por clave devolviendo el valor
persona.pop("profesion")
# Eliminar último elemento (desde Python 3.7)
persona.popitem()
# Vaciar diccionario
persona.clear()
# Modificar elemento
persona["edad"] = 31
Cuándo utilizar diccionarios
SI | NO |
Es necesario almacenar datos relacionados Se necesita acceder rápidamente a los valores Es necesario agregar, eliminar y modificar valores rápidamente | El orden de los elementos es importante Los valores simples Es necesario acceder elementos por posición |
En este artículo hemos comparado las estructuras básicas de Python comparando sus características, operaciones y usos. Espero que les sirva para seleccionar la mejor para cada caso.