Sets en Python: conjuntos, unión, intersección y diferencia

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP