Un set en Python es una colección mutable de elementos únicos. Resulta especialmente útil para eliminar duplicados, comprobar pertenencia y realizar operaciones matemáticas como unión, intersección y diferencia. A diferencia de una lista, no debes depender de una posición ni de un orden de presentación fijo.
En esta guía aprenderás a crear sets, añadir y eliminar valores, comparar colecciones, trabajar con frozenset, construir comprensiones y elegir esta estructura frente a listas o diccionarios. El tutorial oficial sobre conjuntos en Python introduce sus operaciones principales, y la documentación de set y frozenset contiene la referencia completa.
Crear un set
lenguajes = {"Python", "JavaScript", "Go"}
print(lenguajes)Los elementos repetidos se conservan una sola vez:
etiquetas = {"python", "datos", "python", "api"}
print(etiquetas)Para crear un conjunto vacío debes usar set(). Las llaves vacías crean un diccionario:
conjunto_vacio = set()
diccionario_vacio = {}
print(type(conjunto_vacio))
print(type(diccionario_vacio))Convertir una lista y eliminar duplicados
numeros = [4, 2, 4, 1, 2, 5]
unicos = set(numeros)
print(unicos)La conversión elimina duplicados, pero no garantiza conservar el orden original. Cuando necesitas valores únicos en el mismo orden de aparición, un diccionario puede ser más adecuado:
unicos_ordenados = list(dict.fromkeys(numeros))La comparación entre estructuras aparece en la guía de lista, tupla, set y diccionario.
Comprobar pertenencia
permisos = {"leer", "editar", "publicar"}
if "editar" in permisos:
print("El usuario puede editar")Los sets utilizan una tabla hash y suelen ser apropiados para muchas comprobaciones repetidas. La guía del operador in en Python explica las diferencias entre listas, sets y diccionarios.
Añadir elementos
colores = {"azul", "verde"}
colores.add("rojo")
colores.add("azul")
print(colores)add() añade un único elemento. Si ya existe, el set no cambia.
Añadir varios valores con update()
colores = {"azul"}
colores.update(["verde", "rojo"], {"amarillo"})
print(colores)update() recibe uno o varios iterables y añade cada elemento.
Eliminar elementos
usuarios = {"ana", "luis", "marta"}
usuarios.remove("luis")
usuarios.discard("carlos")
print(usuarios)remove()lanzaKeyErrorsi el elemento no existe.discard()no produce error cuando falta.pop()elimina y devuelve un elemento arbitrario.clear()elimina todos los elementos.
Elige remove() cuando la ausencia represente un error lógico y discard() cuando eliminar un valor inexistente sea aceptable.
Unión
equipo_a = {"Ana", "Luis", "Marta"}
equipo_b = {"Marta", "Carlos"}
personas = equipo_a | equipo_b
# equivalente: equipo_a.union(equipo_b)
print(personas)La unión contiene los valores presentes en cualquiera de los conjuntos.
Intersección
comunes = equipo_a & equipo_b
# equivalente: equipo_a.intersection(equipo_b)
print(comunes)La intersección conserva solamente los valores presentes en ambos.
Diferencia
solo_a = equipo_a - equipo_b
print(solo_a)La diferencia no es simétrica: a - b puede producir un resultado distinto de b - a.
Diferencia simétrica
exclusivos = equipo_a ^ equipo_b
print(exclusivos)La diferencia simétrica contiene los elementos que aparecen en uno de los conjuntos, pero no en ambos.
Subconjuntos y superconjuntos
permisos_basicos = {"leer"}
permisos_editor = {"leer", "editar", "publicar"}
print(permisos_basicos <= permisos_editor)
print(permisos_editor >= permisos_basicos)
print(permisos_basicos < permisos_editor)Estas comparaciones son útiles para permisos, requisitos y grupos de características.
Comprobar conjuntos disjuntos
roles_publicos = {"lector", "autor"}
roles_admin = {"administrador", "superusuario"}
print(roles_publicos.isdisjoint(roles_admin))isdisjoint() devuelve verdadero cuando no existe ningún elemento común.
Qué elementos puede contener un set
Los elementos deben ser hashables. Los números, strings, bytes, tuplas inmutables y frozenset suelen ser válidos. Las listas y diccionarios no lo son:
coordenadas = {(10, 20), (30, 40)}
# Esto produce TypeError:
# valores = {[1, 2], [3, 4]}Un objeto hashable debe mantener un hash estable mientras pertenece al conjunto.
frozenset: conjunto inmutable
permisos = frozenset({"leer", "editar"})
print(permisos)frozenset admite operaciones de conjunto, pero no add() ni remove(). Puede utilizarse como clave de diccionario o elemento de otro set.
grupos = {
frozenset({"ana", "luis"}),
frozenset({"marta", "carlos"}),
}Comprensiones de sets
numeros = range(10)
restos = {numero % 3 for numero in numeros}
cuadrados_pares = {
numero ** 2
for numero in numeros
if numero % 2 == 0
}
print(restos)
print(cuadrados_pares)Una comprensión elimina automáticamente los resultados repetidos. La guía de comprensiones en Python explica transformaciones y filtros.
Ejemplo: comparar inventarios
inventario_sistema = {"A101", "A102", "A103", "A105"}
inventario_archivo = {"A101", "A103", "A104", "A105"}
faltan_en_archivo = inventario_sistema - inventario_archivo
sobran_en_archivo = inventario_archivo - inventario_sistema
coinciden = inventario_sistema & inventario_archivo
print("Faltan:", faltan_en_archivo)
print("Sobran:", sobran_en_archivo)
print("Coinciden:", coinciden)Este patrón sirve para sincronizar usuarios, productos, permisos o identificadores.
Ejemplo: palabras únicas
texto = "Python facilita aprender Python y automatizar tareas"
palabras = {
palabra.strip(".,;:!?¡¿").casefold()
for palabra in texto.split()
}
print(palabras)
print(len(palabras))En análisis real de texto puede ser necesario tratar signos, Unicode y palabras vacías con reglas más completas.
Sets y diccionarios
Un set almacena valores únicos. Un diccionario almacena claves únicas asociadas a valores. Si necesitas saber solamente si un identificador existe, un set comunica mejor la intención. Si necesitas recuperar información asociada, utiliza un diccionario. La guía de diccionarios en Python amplía esta estructura.
Modificar durante la iteración
No modifiques el tamaño de un set mientras lo recorres. Crea una copia o una nueva colección:
numeros = {1, 2, 3, 4, 5}
for numero in numeros.copy():
if numero % 2 == 0:
numeros.remove(numero)
print(numeros)Una comprensión suele ser todavía más clara:
impares = {numero for numero in numeros if numero % 2 != 0}Errores frecuentes
- Usar
{}para crear un set vacío. - Esperar que conserve un orden de presentación fijo.
- Intentar guardar listas o diccionarios como elementos.
- Usar
remove()cuando la ausencia es normal. - Confundir la dirección de una diferencia.
- Modificar el conjunto durante el recorrido.
- Convertir a set cuando es necesario preservar duplicados u orden.
Cuándo usar un set
- Eliminar duplicados cuando el orden no importa.
- Realizar muchas pruebas de pertenencia.
- Comparar grupos de identificadores.
- Calcular unión, intersección o diferencia.
- Representar permisos, etiquetas o características únicas.
Conclusión
Los sets en Python representan colecciones de elementos únicos y permiten comparar grupos con operaciones claras. Son una buena elección para pertenencia, eliminación de duplicados, permisos e inventarios, pero no sustituyen a listas ordenadas ni a diccionarios con información asociada.
Elige la estructura según el significado de los datos. Cuando lo importante es la unicidad y la relación entre grupos, un set suele producir una solución más corta, expresiva y eficiente.






