Un set es una bolsa sin orden de elementos únicos
Donde las listas y las tuplas se preocupan por el orden, los sets no. Donde las listas permiten que los duplicados se apilen, los sets los descartan silenciosamente. El set es la estructura de datos correcta cuando tienes dos necesidades específicas:
- Quieres elementos únicos, punto.
- Quieres comprobar pertenencia rápido.
Escribe uno con llaves:
El "red" y "green" duplicados en el segundo set simplemente desaparecen. No es un error — es justo el objetivo.
Crear sets
Las dos formas que realmente usarás:
Ese último punto pilla a todo el mundo una vez: {} crea un diccionario vacío, no un set vacío. La ambigüedad sintáctica tenía que caer en uno de los dos, y ganaron los dicts.
Añadir y quitar
remove vs discard es la distinción clave: remove insiste en que el elemento esté; a discard le da igual. Elige según si la ausencia del elemento debe ser un error.
Pertenencia rápida
Aquí es donde los sets realmente se ganan su sitio. x in some_set se ejecuta en tiempo constante, sin importar lo grande que sea el set. x in some_list tiene que recorrer la lista, lo que se vuelve lento cuando la lista es grande.
Regla general: cada vez que te encuentres escribiendo if x in some_list dentro de un bucle, y la lista tenga más de unas docenas de elementos, convierte la lista a set primero.
Matemáticas de sets
Aquí es donde los sets se ponen genuinamente divertidos. Puedes combinarlos con operadores que reflejan operaciones matemáticas de conjuntos:
Cada operador también tiene una forma con método (.union(), .intersection(), .difference(), .symmetric_difference()). Los operadores son más compactos; los métodos aceptan cualquier iterable, no solo otro set.
Deduplicar una lista
Uno de los usos más comunes de los sets, incluso fuera de la "lógica de conjuntos":
Una línea, duplicados fuera. Una cosa a tener en cuenta: el orden no se preserva. Si necesitas unicidad y el orden original, usa dict.fromkeys() en su lugar:
Los dicts preservan el orden de inserción en Python moderno, y dict.fromkeys construye uno usando los elementos del iterable como claves — efectivamente un set ordenado.
Subconjuntos y superconjuntos
Comprobar si un set está contenido en otro:
Estos aparecen en cosas como comprobaciones de permisos ("¿tiene este usuario todos los roles requeridos?").
Qué puede ir en un set
Solo elementos hasheables. Es un término técnico — en la práctica, significa:
- Las cosas inmutables son hasheables: números, strings, tuplas de hasheables, frozensets.
- Las cosas mutables no lo son: listas, dicts, otros sets no pueden ser miembros de set.
Si necesitas un set de sets, usa frozenset — es una versión inmutable de set.
La iteración no tiene orden
Iterar sobre un set te da los elementos sin orden garantizado:
Ejecútalo unas cuantas veces y verás que el orden varía. Si el orden importa, un set no es la estructura correcta — ordena el contenido cuando lo necesites, o usa una lista.
Cuándo no usar un set
Si alguna de estas es verdadera, una lista o dict probablemente encaje mejor:
- Te importa el orden.
- Necesitas guardar duplicados.
- Cada elemento tiene datos asociados (usa un dict con el elemento como clave).
Seguimos
Los sets manejan unicidad y pertenencia. Los diccionarios — que vienen ahora — manejan el patrón más amplio de "busca un valor por una clave", que probablemente es la estructura de datos no-lista más útil en Python.
Preguntas frecuentes
¿Qué es un set en Python?
Un set es una colección sin orden de elementos únicos. Los sets usan llaves sin pares clave-valor: colors = {'red', 'green', 'blue'}. Añadir el mismo valor dos veces no tiene efecto — los duplicados se descartan silenciosamente.
¿Cuándo debería usar un set en lugar de una lista?
Usa un set cuando te importe la unicidad o cuando vayas a hacer muchas comprobaciones de pertenencia (x in collection). Los sets quitan duplicados automáticamente y comprueban pertenencia en tiempo constante, lo que para colecciones grandes es una mejora enorme sobre las listas.
¿Cómo creo un set vacío en Python?
Usa set(), no {} — las llaves sin nada dentro crean un diccionario vacío, no un set vacío. Una vez que tienes un set, puedes añadir elementos con .add(value).