Historia de la cuestión:
Los conjuntos (set) fueron introducidos en Python como un tipo integrado separado a partir de Python 2.4 (antes se implementaban como un módulo externo). Permiten almacenar elementos únicos y desordenados de manera eficiente y soportan muchas operaciones estándar de la teoría de conjuntos: unión, intersección, diferencia, diferencia simétrica y verificación de subconjuntos.
Problema:
Sin set, se tienen que usar listas, lo que da lugar a una búsqueda ineficaz de elementos únicos, ralentizando los algoritmos que utilizan muchas comprobaciones de pertenencia. El set está implementado a través de una tabla hash, por lo que todas las operaciones de búsqueda, adición y eliminación se realizan en tiempo amortizado O(1). Sin embargo, esta estructura puede causar problemas inesperados, por ejemplo, la pérdida del orden de los elementos, restricciones sobre los tipos de elementos (deben ser inmutables y hashables), y la falta de comprensión de las características de comparación de conjuntos y su interacción con otras estructuras.
Solución:
Utilizar set cuando se requiere almacenar solo elementos únicos y realizar sobre ellos operaciones de teoría de conjuntos. Es importante recordar que los elementos deben ser hashables (por ejemplo, números, cadenas, tuple, pero no listas ni dict). Se proporciona un rico conjunto de métodos integrados para trabajar con set (add, remove, union, intersection, difference, issubset, entre otros).
Ejemplo de código:
s1 = {1, 2, 3, 4} s2 = {3, 4, 5} print(s1 | s2) # {1, 2, 3, 4, 5} (unión) print(s1 & s2) # {3, 4} (intersección) print(s1 - s2) # {1, 2} (diferencia) print(3 in s1) # True (comprobación de pertenencia)
Características clave:
¿Se pueden añadir tipos mutables (por ejemplo, listas) a un set?
No, los elementos de un conjunto deben ser hashables y inmutables. No se puede añadir una lista o dict a un set, Python lanzará un TypeError.
s = set() s.add([1, 2, 3]) # TypeError: unhashable type: 'list'
¿Un set mantiene el orden de los elementos?
No. Desde el momento de su creación, los elementos de un set no se devuelven garantizados en el orden en que fueron añadidos, especialmente al cambiar el tamaño del conjunto.
s = {5, 2, 8, 1} print(s) # Orden no definido
¿Cuál es la diferencia entre set y frozenset y se puede usar frozenset como elemento de un set?
frozenset es la versión inmutable de set. Puede ser utilizado como un elemento de otro set o como clave de un dict, ya que es hashable.
fs = frozenset([1, 2, 3]) s = set() s.add(fs) # OK
Un desarrollador quería almacenar elementos únicos y eligió set, sin tener en cuenta el orden en que aparecían. Como resultado, parte de la lógica empresarial que dependía del orden de procesamiento dejó de funcionar.
Pros:
Contras:
En una tarea de filtrado rápido de registros únicos de un gran conjunto, se eligió set porque solo importaba el hecho de la unicidad, no el orden. La velocidad aumentó significativamente y el código se simplificó.
Pros:
Contras: