Los sets o conjuntos de Python almacenan elementos únicos y permiten realizar búsquedas, uniones, intersecciones y diferencias. Son especialmente útiles para eliminar duplicados, comparar grupos y validar pertenencia. A diferencia de una lista, un set no está diseñado para mantener posiciones ni acceder mediante índices.
Para ampliar conceptos, consulta las guías sobre listas, tuplas, diccionarios, comprensiones y operadores. Como fuentes externas, revisa la documentación oficial de set y frozenset y el tutorial oficial de estructuras de datos.
Crear un set
lenguajes = {"Python", "Java", "JavaScript"}
print(lenguajes)Los duplicados se eliminan automáticamente. El orden mostrado no debe utilizarse como parte de la lógica.
El set vacío
vacio = set(){} crea un diccionario vacío, no un set. Esta diferencia es una fuente frecuente de errores para principiantes.
Eliminar duplicados
correos = [
"[email protected]",
"[email protected]",
"[email protected]",
]
unicos = set(correos)
print(unicos)La conversión no conserva necesariamente el orden. Si necesitas eliminar duplicados manteniendo la primera aparición, puedes utilizar list(dict.fromkeys(correos)).
Comprobar pertenencia
extensiones = {".pdf", ".csv", ".json"}
if ".csv" in extensiones:
print("Formato permitido")La pertenencia es uno de los usos principales de los sets. Para grupos grandes suele ser más apropiada que recorrer una lista repetidamente.
Añadir elementos
extensiones.add(".txt")
extensiones.update({".xml", ".yaml"})add() añade un elemento. update() consume un iterable y añade cada elemento. Pasar una cadena directamente a update() agregaría sus caracteres, por lo que debe envolverse en una colección cuando representa un único valor.
Eliminar elementos
extensiones.remove(".xml")
extensiones.discard(".desconocida")remove() lanza KeyError si el elemento no existe. discard() no falla. Elige según si la ausencia representa un error.
pop() no elimina el último
elemento = extensiones.pop()Como los sets no tienen un orden de posición contractual, pop() elimina un elemento arbitrario. No lo uses para obtener “el primero” o “el último”.
Unión
backend = {"Python", "SQL", "Docker"}
frontend = {"JavaScript", "CSS", "Docker"}
todas = backend | frontend
# también: backend.union(frontend)La unión contiene todos los elementos sin duplicados.
Intersección
comunes = backend & frontendLa intersección muestra elementos presentes en ambos grupos. Es útil para comparar permisos, etiquetas, habilidades o identificadores.
Diferencia
solo_backend = backend - frontendLa diferencia no es simétrica: a - b y b - a pueden producir resultados distintos.
Diferencia simétrica
exclusivos = backend ^ frontendDevuelve elementos presentes en uno de los grupos, pero no en ambos.
Subconjuntos y superconjuntos
requeridos = {"Python", "SQL"}
candidato = {"Python", "SQL", "Git"}
if requeridos <= candidato:
print("Cumple todos los requisitos")<= comprueba subconjunto y >= superconjunto. Las variantes estrictas < y > exigen que los grupos no sean iguales.
Elementos permitidos
Los miembros deben ser hashables. Strings, números y tuplas inmutables suelen ser válidos. Listas, diccionarios y sets normales no pueden ser elementos porque pueden cambiar.
coordenadas = {(10, 20), (30, 40)}frozenset
permisos = frozenset({"leer", "escribir"})frozenset es inmutable y puede utilizarse como clave de diccionario o miembro de otro set. Es útil para configuraciones que no deben modificarse.
Comprensiones de set
cuadrados = {numero ** 2 for numero in range(-5, 6)}Los resultados duplicados se eliminan. En este ejemplo, números positivos y negativos producen algunos cuadrados iguales.
Comparar archivos o registros
ids_anteriores = {"A1", "A2", "A3"}
ids_actuales = {"A2", "A3", "A4"}
nuevos = ids_actuales - ids_anteriores
eliminados = ids_anteriores - ids_actuales
sin_cambios = ids_actuales & ids_anterioresEste patrón es práctico para sincronizaciones y auditorías.
Mutación durante iteración
No añadas ni elimines elementos del mismo set que estás recorriendo. Crea una copia, construye un nuevo conjunto o calcula primero los elementos que deben cambiar.
for valor in conjunto.copy():
if debe_eliminarse(valor):
conjunto.discard(valor)Sets y orden
Si la salida necesita un orden estable, ordénala al mostrar: sorted(conjunto). No conviertas el orden observado en una dependencia, porque no es la finalidad de esta estructura.
Rendimiento y memoria
Un set suele ofrecer comprobaciones de pertenencia rápidas porque utiliza una tabla hash. Esa ventaja tiene un coste de memoria superior al de una lista sencilla. No conviertas automáticamente todas las colecciones en sets: si solo recorres los datos una vez, necesitas duplicados o dependes del orden, una lista puede ser más adecuada. Elige la estructura según las operaciones principales.
Copias y actualizaciones en el lugar
Métodos como intersection_update(), difference_update() y symmetric_difference_update() modifican el set existente. Las operaciones con símbolos suelen producir uno nuevo. Esta diferencia importa cuando varias variables comparten la misma referencia. Si deseas conservar el original, usa copy() antes de una actualización destructiva.
Pruebas y errores frecuentes
Prueba sets vacíos, grupos iguales, elementos ausentes y datos duplicados. Los errores habituales son crear un diccionario con {}, intentar añadir listas, usar pop() como si existiera orden, perder el orden original al eliminar duplicados y confundir diferencia con diferencia simétrica.
Elegir set frente a diccionario
Si necesitas asociar información adicional a cada clave, utiliza un diccionario. Un set solo representa presencia o ausencia. Esta distinción mantiene el modelo simple y evita estructuras paralelas difíciles de sincronizar.
Conclusión
Los sets son la herramienta adecuada cuando importan unicidad, pertenencia y relaciones entre grupos. Utiliza unión, intersección y diferencia para expresar reglas de forma clara. Recurre a frozenset cuando necesites inmutabilidad y ordena únicamente en el momento de presentar los resultados.






