Python ofrece varias estructuras de datos integradas para guardar colecciones. Las más importantes son listas, tuplas, sets y diccionarios. Todas pueden contener varios valores, pero se comportan de manera distinta respecto al orden, la mutabilidad, los duplicados y la forma de buscar información. Elegir la estructura correcta simplifica el código y evita conversiones innecesarias.
Para ampliar conceptos, consulta las guías sobre listas, tuplas, sets, diccionarios y bucles. La documentación oficial de estructuras de datos y la referencia oficial de tipos integrados explican su comportamiento con detalle.
Resumen rápido
- Lista: ordenada, mutable y admite duplicados.
- Tupla: ordenada, inmutable y admite duplicados.
- Set: colección de valores únicos, sin acceso por índice.
- Diccionario: asociación entre claves únicas y valores.
Estas definiciones son el punto de partida, pero la decisión real depende de cómo vas a consultar y modificar los datos.
Listas
frutas = ["manzana", "pera", "manzana"]
frutas.append("naranja")
frutas[0] = "fresa"
Una lista mantiene el orden de inserción, permite repetir valores y puede modificarse. Es apropiada para secuencias de tareas, productos, resultados, mensajes o cualquier colección cuyo orden importe.
Los elementos se consultan por índice:
print(frutas[0])
print(frutas[-1])
print(frutas[1:3])
Entre sus métodos más usados están append, extend, insert, remove, pop, sort y reverse.
Tuplas
coordenada = (10, 25)
nombre, edad = ("Ana", 30)
Una tupla también conserva el orden y admite duplicados, pero no permite sustituir, añadir o eliminar elementos después de su creación. Es útil cuando un grupo de valores representa una unidad fija: coordenadas, dimensiones, colores RGB o resultados múltiples.
def limites(valores):
return min(valores), max(valores)
minimo, maximo = limites([4, 2, 9])
El retorno parece múltiple, pero en realidad es una tupla.
Sets
etiquetas = {"python", "web", "python"}
print(etiquetas)
El duplicado desaparece. Un set es ideal para unicidad, pertenencia y operaciones matemáticas:
usuarios_a = {1, 2, 3}
usuarios_b = {3, 4, 5}
print(usuarios_a | usuarios_b) # unión
print(usuarios_a & usuarios_b) # intersección
print(usuarios_a - usuarios_b) # diferencia
No debes depender del orden visual ni intentar acceder con set[0]. Para añadir y eliminar valores usa add, update, remove y discard.
Diccionarios
usuario = {
"nombre": "Ana",
"edad": 30,
"activo": True,
}
Un diccionario relaciona claves con valores. Las claves son únicas y deben ser hashables. Los valores pueden ser de cualquier tipo.
print(usuario["nombre"])
print(usuario.get("telefono", "No disponible"))
usuario["edad"] = 31
usuario["ciudad"] = "Madrid"
Los diccionarios son apropiados para registros, configuraciones, índices, contadores y datos JSON.
Orden
Las listas y tuplas tienen un orden explícito. Los diccionarios conservan el orden de inserción, aunque el acceso principal se realiza mediante claves. Los sets no deben usarse cuando el orden sea parte del significado.
Si necesitas valores únicos y ordenados, puedes combinar estructuras:
valores = [3, 1, 3, 2, 1]
unicos_en_orden = list(dict.fromkeys(valores))
Mutabilidad
Listas, sets y diccionarios son mutables. Las tuplas son inmutables. La mutabilidad afecta las asignaciones:
a = [1, 2]
b = a
b.append(3)
print(a) # [1, 2, 3]
a y b apuntan al mismo objeto. Para obtener otra lista utiliza a.copy() o un slicing. Si hay objetos anidados, una copia superficial puede no ser suficiente.
Duplicados
Listas y tuplas admiten duplicados. Los sets eliminan valores repetidos. Los diccionarios no pueden tener dos claves idénticas; una asignación posterior sustituye el valor anterior.
datos = {"a": 1, "a": 2}
print(datos) # {'a': 2}
Los valores de un diccionario sí pueden repetirse.
Búsqueda y pertenencia
if "python" in etiquetas:
print("Encontrado")
if "nombre" in usuario:
print("Existe la clave")
La pertenencia en sets y diccionarios suele ser muy eficiente porque utilizan tablas hash. En una lista o tupla, Python normalmente recorre los elementos hasta encontrar el valor.
No conviertas automáticamente una lista pequeña a set si solo harás una comprobación. La creación también tiene un coste. La decisión depende del tamaño y de la frecuencia de búsquedas.
Elementos hashables
Los elementos de un set y las claves de un diccionario deben ser hashables. Strings, números y tuplas formadas por valores hashables suelen cumplir esta condición. Las listas y diccionarios no pueden ser claves:
coordenadas = {(10, 20), (30, 40)}
indice = {(10, 20): "Madrid"}
Una tupla que contiene una lista tampoco es hashable.
Comprensiones
cuadrados_lista = [n * n for n in range(5)]
cuadrados_set = {n * n for n in range(5)}
cuadrados_dict = {n: n * n for n in range(5)}
No existe una comprensión específica de tuplas. Una expresión entre paréntesis produce un generador; para construir una tupla usa tuple(...).
Conversión entre estructuras
lista = [1, 2, 2, 3]
tupla = tuple(lista)
conjunto = set(lista)
otra_lista = list(conjunto)
Las conversiones pueden perder información. Al convertir a set desaparecen duplicados y el orden original deja de ser una garantía útil. Al convertir un diccionario a lista obtienes sus claves:
claves = list(usuario)
pares = list(usuario.items())
Cuándo usar una lista
Usa una lista cuando necesites mantener una secuencia modificable, acceder por posición, ordenar, añadir elementos o conservar duplicados. Ejemplos: carrito de compras, cola simple, historial, resultados de una consulta y pasos de una receta.
Cuándo usar una tupla
Usa una tupla cuando los valores formen un registro pequeño y fijo, cuando quieras dejar clara la intención de no modificarlo o cuando necesites una clave compuesta. Para registros con muchos campos, considera NamedTuple, dataclasses o clases normales.
Cuándo usar un set
Usa un set para eliminar duplicados, comparar grupos, encontrar intersecciones o realizar muchas pruebas de pertenencia. Ejemplos: permisos, etiquetas, identificadores procesados y palabras prohibidas.
Cuándo usar un diccionario
Usa un diccionario cuando cada valor se identifique mediante una clave significativa. Ejemplos: usuario por correo, precio por producto, configuración por nombre y contador por palabra.
Estructuras anidadas
usuarios = [
{
"id": 1,
"nombre": "Ana",
"roles": {"editor", "autor"},
},
{
"id": 2,
"nombre": "Luis",
"roles": {"lector"},
},
]
Una lista conserva el orden de usuarios, cada diccionario representa un registro y cada set evita roles duplicados. Las estructuras pueden combinarse según el significado.
Ejemplo práctico: inventario
productos = {
"A100": {"nombre": "Teclado", "precio": 50.0, "stock": 4},
"B200": {"nombre": "Ratón", "precio": 20.0, "stock": 8},
}
codigos = set(productos)
ordenados = sorted(productos.items(), key=lambda item: item[1]["precio"])
resumen = (len(productos), sum(p["stock"] for p in productos.values()))
El diccionario permite buscar por código, el set representa identificadores únicos, la lista devuelta por sorted conserva el orden y la tupla resume dos valores fijos.
Errores frecuentes
Entre los errores habituales están usar una lista como clave, esperar orden estable en un set, modificar una colección mientras se recorre, confundir {} con un set vacío y crear copias superficiales de datos anidados. Recuerda que {} crea un diccionario vacío; para un set vacío usa set().
Conclusión
No existe una estructura universalmente mejor. La lista representa una secuencia mutable; la tupla, un grupo fijo; el set, valores únicos; y el diccionario, asociaciones clave-valor. Elige según el significado, la forma de acceso, la necesidad de cambios y la presencia de duplicados. Una buena elección hace que el código explique por sí mismo cómo deben utilizarse los datos.






