Estructuras en Python, cuál usar

Publicado por Andrea Navarro el

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:

TipoNombreOrdenadoModificableDuplicadoIndexable
ListalistSISISISI
TuplatupleSINOSISI
ConjuntosetNOSINONO
DiccionariodictSI (desde 3.7)SIClaves únicasSI(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

SINO
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

SINO
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.

NombreOperaciónResultado
Unióna | b o a.union(b)Elementos de a más de los b
Interseccióna & b o a.intersection(b)Elementos que están en a y b
Diferenciaa - b o a.difference(b)Elementos de a que no están en b
Diferencia simétricaa ^ b o a.symmetric_difference(b)Elementos exclusivos de cada conjunto
Subconjuntoa <= b o a.issubset(b)True si a está contenido en b
Superconjuntob >= a o b.issuperset(a)True si a contiene a b
Disjuntosa.isdisjoint(b)True si no comparten elementos

Cuándo utilizar conjuntos

SINO
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

SINO
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.


¿Querés aprender más? 📚

👉 Visitá nuestros cursos!
💬 Y si tenés dudas, o querés dejarnos tus comentarios sumate a la Comunidad JuncoTIC en Telegram!
¡Te esperamos!

Categorías: Programación

Andrea Navarro

- Ingeniera en Informática - Docente universitaria - Investigadora