Conjuntos y Frozensets
Los conjuntos almacenan elementos hasheables únicos con pruebas de pertenencia rápidas. Los frozensets son conjuntos inmutables que puedes usar como claves de diccionario o elementos de otros conjuntos.
Receta
seen: set[int] = set()
for value in [1, 2, 2, 3]:
if value not in seen:
seen.add(value)
a, b = {1, 2, 3}, {3, 4}
union = a | b
only_a = a - bCuándo usar esto:
- Deducir secuencias antes de procesar
- Intersecciones de permisos/etiquetas
- Colecciones de vecinos de grafos
- Encontrar diferencias simétricas entre instantáneas
Ejemplo de Trabajo
def unique_preserve_order(items: list[str]) -> list[str]:
seen: set[str] = set()
result: list[str] = []
for item in items:
if item not in seen:
seen.add(item)
result.append(item)
return result
def jaccard(tags_a: set[str], tags_b: set[str]) -> float:
if not tags_a and not tags_b:
return 1.0
return len(tags_a & tags_b) / len(tags_a | tags_b)
def frozen_key(groups: list[frozenset[str]]) -> dict[frozenset[str], int]:
return {group: len(group) for group in groups}
if __name__ == "__main__":
print(unique_preserve_order(["a", "b", "a", "c"]))
print(jaccard({"py", "ml"}, {"py", "web"}))
print(frozen_key([frozenset({"a", "b"}), frozenset({"c"})]))Lo que esto demuestra:
- Deduplicación manual que preserva el orden cuando
dict.fromkeysno tiene suficiente control de ordenación &y|para intersección y uniónfrozensetcomo clave de diccionario para agrupaciones
Inmersión Profunda
Cómo Funciona
- Conjunto hash (Hash set) - O(1) promedio igual que las claves de diccionario sin valores.
- No ordenado - El orden de iteración depende de la implementación; no confíes en él para la semántica.
- frozenset - Inmutable; hasheable si los elementos son hasheables.
- Pruebas de subconjuntos -
a <= b,a < b,a >= bpara contención. - Comprensiones -
{x for x in items if cond}construye conjuntos directamente.
Operaciones
| Operador | Significado |
|---|---|
| | unión |
& | intersección |
- | diferencia |
^ | diferencia simétrica |
Notas de Python
# conjunto vacío - no {}
empty = set()
# añadir en bloque
tags.update(["a", "b", "c"])
# discard vs remove - discard ignora los elementos faltantes
tags.discard("missing")Errores Comunes
{}es un diccionario vacío - Usaset()para un conjunto vacío. Solución:set()o un marcador de posición{0}solo si es intencional.- Elementos no hasheables - Las listas en conjuntos fallan. Solución: Convertir a tupla o frozenset.
- Suposiciones de orden - Los conjuntos no preservan el orden de inserción para la lógica. Solución: truco
dict.fromkeyso bucle de deduplicación ordenado. - Conjuntos muy pequeños más lentos que el escaneo de listas - La sobrecarga constante importa para n < ~10. Solución: Perfila antes de optimizar.
- Mutar el conjunto durante la iteración - Error de cambio de tamaño. Solución: Copia
set(s)antes de eliminar en el bucle.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
dict.fromkeys | Claves únicas que preservan el orden | Necesitas álgebra de conjuntos |
list + in | n muy pequeño | Comprobaciones de pertenencia grandes |
bloom filter | Probabilístico a gran escala | Necesitas pertenencia exacta |
pandas.unique | Deduplicación de columnas en dataframes | Script de Python simple |
Preguntas Frecuentes
¿set o list para la unicidad?
set cuando el orden no importa y la pertenencia es frecuente. La deduplicación que preserva el orden usa diccionarios o bucles manuales.
¿Para qué sirve frozenset?
Conjunto hasheable - claves de diccionario, elementos de conjunto, claves de caché a partir de frozensets de etiquetas.
¿Cómo se intersectan muchos conjuntos?
from functools import reduce; reduce(set.__and__, sets) o bucle con acc &= s.
¿issubset vs <=?
Lo mismo para conjuntos; elige el operador o método legible de manera consistente en la base de código.
¿Pueden los conjuntos contener tipos mixtos?
Sí, si todos los elementos son hasheables y comparables por igualdad; pero perjudica la claridad; prefiere conjuntos homogéneos.
¿Cómo deducir y preservar el orden en Python 3.7+?
list(dict.fromkeys(items)) - patrón idiomático rápido.
¿Caso de uso de symmetric_difference?
Elementos en uno de los conjuntos pero no en ambos; diferencia concesiones de permisos entre entornos.
¿Comprensión de conjuntos vs filter?
{x for x in items if pred(x)} construye el conjunto directamente sin una lista intermedia.
¿Son los conjuntos seguros para hilos (thread-safe)?
Las operaciones individuales son atómicas en CPython, pero las lecturas-modificaciones-escrituras compuestas necesitan bloqueos.
¿pop de un conjunto?
set.pop() elimina un elemento arbitrario; útil solo cuando cualquier elemento es aceptable.
Relacionado
- Diccionarios - mapas vs conjuntos
- Inmutabilidad y Hashabilidad - reglas de hash
- Módulo collections - Counter usa dict, no set
- Elegir la Estructura de Datos Correcta - patrones de pertenencia
Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.