Por qué la unión () no contiene todos los elementos
Los 1
y True
son equivalentes y se consideran duplicados. Asimismo, 0
y también False
son equivalentes:
>>> 1 == True
True
>>> 0 == False
True
Qué valor equivalente se usa
Cuando se encuentran varios valores equivalentes, los conjuntos mantienen el primero que se ve:
>>> {0, False}
{0}
>>> {False, 0}
{False}
Formas de hacer que los valores sean distintos
Para que sean tratados como distintos, simplemente guárdelos en un (value, type)
par:
>>> set1 = {(1, int), (2, int), (3, int)}
>>> set2 = {(True, bool), (False, bool)}
>>> set1 | set2
{(3, <class 'int'>), (1, <class 'int'>), (2, <class 'int'>),
(True, <class 'bool'>), (False, <class 'bool'>)}
>>> set1 & set2
set()
Otra forma de diferenciar los valores es almacenarlos como cadenas:
>>> set1 = {'1', '2', '3'}
>>> set2 = {'True', 'False'}
>>> set1 | set2
{'2', '3', 'False', 'True', '1'}
>>> set1 & set2
set()
Espero que esto aclare el misterio y muestre el camino a seguir :-)
Rescatado de los comentarios:
Esta es la técnica estándar para romper la equivalencia de tipo cruzado (es decir 0.0 == 0
, True == 1
y Decimal(8.5) == 8.5)
. La técnica se usa en el módulo de expresión regular de Python 2.7 para forzar que las expresiones regulares Unicode se almacenen en caché de forma distinta a las expresiones regulares str equivalentes. La técnica también se usa en Python 3 para functools.lru_cache () cuando el parámetro escrito es verdadero.
Si el OP necesita algo más que la relación de equivalencia predeterminada, entonces es necesario definir alguna nueva relación. Dependiendo del caso de uso, eso podría ser insensibilidad a mayúsculas y minúsculas para cadenas, normalización para Unicode, apariencia visual (las cosas que se ven diferentes se consideran diferentes), identidad (no hay dos objetos distintos que se consideren iguales), un par de valor / tipo o alguna otra. función que define una relación de equivalencia. Dado el ejemplo específico de los PO, parecería que esperaba una distinción por tipo o una distinción visual.