Un set de Python es una colección no ordenada de elementos únicos. Los duplicados desaparecen automáticamente y las operaciones de pertenencia son O(1) en lugar de O(n) como en las listas. Cuando necesitas eliminar duplicados, comprobar si un valor existe o realizar operaciones de conjuntos matemáticos, el set es la herramienta correcta.
Crear sets
# Con llaves (cuidado: {} crea un dict vacío, no un set)
colores = {"rojo", "verde", "azul", "rojo"}
print(colores) # {'rojo', 'verde', 'azul'} duplicado eliminado
# Desde una lista (forma común para eliminar duplicados)
lista = [1, 2, 2, 3, 3, 3, 4]
unicos = set(lista)
print(unicos) # {1, 2, 3, 4}
# Set vacío (obligatoriamente con set(), no con {})
vacio = set()
print(type(vacio)) #
Operaciones de conjuntos
python_devs = {"Ana", "Luis", "María", "Pedro"}
js_devs = {"Luis", "María", "Juan", "Sara"}
# Unión: todos los elementos de ambos sets
todos = python_devs | js_devs
# {'Ana', 'Juan', 'Luis', 'María', 'Pedro', 'Sara'}
# Intersección: solo los que están en los dos
ambos = python_devs & js_devs
# {'Luis', 'María'}
# Diferencia: los de python_devs que NO están en js_devs
solo_python = python_devs - js_devs
# {'Ana', 'Pedro'}
# Diferencia simétrica: los que están en uno pero no en ambos
exclusivos = python_devs ^ js_devs
# {'Ana', 'Juan', 'Pedro', 'Sara'}
Métodos útiles: add, discard, in
s = {1, 2, 3}
s.add(4) # añade un elemento
s.add(2) # no hace nada (ya existe)
s.discard(10) # no lanza error si el elemento no existe
s.remove(3) # lanza KeyError si no existe
print(2 in s) # True comprobación O(1)
print(9 in s) # False
# issubset, issuperset
print({1, 2}.issubset({1, 2, 3, 4})) # True
print({1, 2, 3}.issuperset({1, 2})) # True
Set comprehension
texto = "programación en python"
consonantes = {c for c in texto if c not in "aeiouáéíóú "}
print(consonantes) # conjunto de consonantes únicas
# Cuadrados únicos (elimina duplicados de -3 al 3)
cuadrados = {x**2 for x in range(-3, 4)}
print(cuadrados) # {0, 1, 4, 9}
frozenset: un set inmutable
frozenset es un set que no puede modificarse una vez creado. Esto lo hace hashable, por lo que puede usarse como clave de diccionario o elemento de otro set.
permisos_admin = frozenset({"leer", "escribir", "ejecutar", "borrar"})
permisos_user = frozenset({"leer", "ejecutar"})
# Los frozensets pueden ser claves de diccionario
roles = {
permisos_admin: "administrador",
permisos_user: "usuario"
}
print(permisos_user.issubset(permisos_admin)) # True
# Intentar modificar lanza AttributeError
# permisos_admin.add("otro") # ERROR
Cuando la velocidad de búsqueda importa y el orden no, convierte tu lista en un set. La diferencia entre if x in lista (O(n)) y if x in conjunto (O(1)) se vuelve muy notable con millones de elementos.
