Lecciones del módulo (4/4)
Conjuntos
Un conjunto (set) es una colección de elementos únicos y no ordenados. Tres superpoderes:
- Deduplicación automática: añadir el mismo elemento dos veces no tiene efecto.
- Prueba de pertenencia O(1):
x in ses extremadamente rápido incluso con millones de elementos (está basado en hash, como los diccionarios). - Operaciones de conjuntos: unión, intersección, diferencia, diferencia simétrica.
Crear un conjunto
vuoto = set() # ATENCIÓN: {} es un diccionario vacío, ¡no un conjunto!
numeri = {1, 2, 3}
da_lista = set([1, 1, 2, 3, 3, 3]) # {1, 2, 3}Las llaves solas {} crean un diccionario vacío, no un conjunto: para un conjunto vacío
necesitas set().
Modificar un conjunto
s = {1, 2, 3}
s.add(4) # {1, 2, 3, 4}
s.add(1) # sin efecto (ya presente)
s.discard(99) # elimina si está presente, silencioso de lo contrario
s.remove(2) # elimina o lanza KeyErrorOperaciones de conjuntos
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
a | b # {1, 2, 3, 4, 5, 6} unión
a & b # {3, 4} intersección
a - b # {1, 2} diferencia (en a pero no en b)
a ^ b # {1, 2, 5, 6} diferencia simétrica (xor)También existen formas metodológicas (a.union(b), a.intersection(b), …) que
además aceptan cualquier iterable, no solo conjuntos.
Prueba de pertenencia
parole = {"ciao", "mondo", "python"}
"ciao" in parole # True O(1)
"java" not in parole # TrueEn comparación: buscar con in dentro de una list es O(n) y en listas largas
es muchísimo más lento.
Frozen set: la versión inmutable
frozenset({1, 2, 3}) es la versión hashable: puede ser una clave de diccionario o un
elemento de otro conjunto.
Operaciones de conjuntos y rendimiento
Los conjuntos se implementan como tablas hash, lo que hace que las pruebas de pertenencia (x in mi_conjunto) sean extremadamente rápidas: se ejecutan en tiempo constante O(1), a diferencia de las listas, donde la búsqueda requiere tiempo lineal O(n). Además, admiten operaciones algebraicas como la unión (|), la intersección (&) y la diferencia (-).
Pruébalo tú
Dada la lista `nums = [1, 2, 2, 3, 3, 3, 4]`, construye `unique_items` con los valores únicos (en cualquier orden) y luego calcula `count` como len(unique_items). Evalúa `count`.
Mostrar pista
set(nums) elimina los duplicados.
Solución disponible después de 3 intentos
Ejercicio de repaso
Dados `a = {1, 2, 3, 4}` y `b = {3, 4, 5, 6}`, calcula la intersección en `common_items` y la diferencia a-b en `only_a`. Evalúa la tupla `(common_items, only_a)`.
Mostrar pista
& intersección, - diferencia.
Solución disponible después de 3 intentos
Desafío adicional
Dados dos conjuntos `set_a = {1, 2, 3}` y `set_b = {2, 3, 4}`, calcula la intersección matemática de los dos conjuntos (sus elementos comunes). Guarda el conjunto resultante en `common_elements` y evalúalo.
Mostrar pista
Puedes usar el operador & o el método set_a.intersection(set_b).
Solución disponible después de 3 intentos