Conjuntos (La Tolva)
Fig. 5.4: Un conjunto elimina los duplicados.
El Conjunto (set) es un contenedor con una sola regla, pero inflexible: NO SE ADMITEN DUPLICADOS.
Piénsalo como la tolva del almacén: por dentro, la pared del fondo está dividida en compartimentos, uno para cada objeto distinto que puede caer ahí. Cuando algo entra, la tolva lo manda directo a su compartimento, sin fijarse en el orden de llegada. Si metes una manzana y ya hay una manzana en su compartimento, la segunda cae en el mismo lugar que la primera: no se apilan, no se duplican, simplemente coinciden. Por eso preguntar “¿está la manzana?” no exige revisar la tolva entera: vas derecho al compartimento que le toca, sin importar cuántos objetos haya alrededor. Y como esos compartimentos no están numerados en fila, lo que queda dentro no tiene “primero” ni “último”: ningún índice, ningún orden.
Fortalezas del Conjunto
- Unicidad Total: Garantiza que cada elemento aparezca una sola vez.
- Operaciones Matemáticas: Puedes hacer uniones, intersecciones y diferencias.
Gestión de la Tolva
1. Construcción
Usamos llaves {} igual que los diccionarios, pero sin los dos puntos :.
# Solo listamos los elementos
invitados: set[str] = {"Ana", "Beto", "Carla"}
¡Ojo!:
{}no crea un conjunto vacío, crea un diccionario vacío (las llaves estaban ocupadas antes). Para un conjunto vacío de verdad, usaset().vacio_mal = {} # esto es un dict vacio_bien = set() # esto sí es un conjunto vacío
2. El Truco de Limpieza
El uso más frecuente de los conjuntos es sanear listas con repetidos. Datos que vienen de formularios, archivos CSV o respuestas de APIs suelen traer duplicados. Un set() los elimina en un solo paso.
lista_sucia = ["Ana", "Beto", "Ana", "Carla", "Beto"]
# Cada nombre repetido cae en su propio compartimento, no en uno nuevo
limpios = set(lista_sucia)
# Resultado: un orden cualquiera (los conjuntos no garantizan orden)
3. Meter, Sacar y Preguntar
Un conjunto crece con .add() y se reduce con .discard() (que ni se inmuta si el elemento no estaba):
invitados: set[str] = {"Ana", "Beto", "Carla"}
invitados.add("Diego")
invitados.discard("Beto")
Lo que de verdad lo distingue es la pregunta in. Como cada elemento tiene su propio compartimento, comprobar si algo está dentro no exige recorrer el conjunto entero: vas directo al lugar que le toca. Cuando solo te importa “¿está o no está?”, un set le gana a una lista, que sí tiene que revisar sus cajas una por una.
invitados: set[str] = {"Ana", "Beto", "Carla"}
print("Ana" in invitados) # True, en tiempo constante
4. Operaciones de Conjunto
Aquí está la otra razón para usarlos: combinar grupos como en los diagramas de Venn de la escuela.
turno_manana = {"Ana", "Beto", "Carla"}
turno_tarde = {"Beto", "Diego"}
print(turno_manana | turno_tarde) # Unión: {"Ana", "Beto", "Carla", "Diego"}
print(turno_manana & turno_tarde) # Intersección: {"Beto"}
print(turno_manana - turno_tarde) # Diferencia: {"Ana", "Carla"}
¡Ojo!: Como los conjuntos no tienen orden, no puedes pedir
invitados[0]. Te dará un error porque el concepto de “posición 0” no existe aquí.