¿Por qué cuando cambio el orden de los dos conjuntos en las uniones siguientes, obtengo resultados diferentes?
set1 = {1, 2, 3}
set2 = {True, False}
print(set1 | set2)
# {False, 1, 2, 3}
print(set2 | set1)
#{False, True, 2, 3}
¿Por qué cuando cambio el orden de los dos conjuntos en las uniones siguientes, obtengo resultados diferentes?
set1 = {1, 2, 3}
set2 = {True, False}
print(set1 | set2)
# {False, 1, 2, 3}
print(set2 | set1)
#{False, True, 2, 3}
Respuestas:
Los 1
y True
son equivalentes y se consideran duplicados. Asimismo, 0
y también False
son equivalentes:
>>> 1 == True
True
>>> 0 == False
True
Cuando se encuentran varios valores equivalentes, los conjuntos mantienen el primero que se ve:
>>> {0, False}
{0}
>>> {False, 0}
{False}
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.
En Python, False
y 0
se consideran equivalentes, al igual que True
y 1
. Debido a que True
y 1
se consideran del mismo valor, solo uno de ellos puede estar presente en un conjunto al mismo tiempo. Cuál depende del orden en que se agregan al conjunto. En la primera línea, set1
se usa como primer conjunto, por lo que obtenemos 1
el conjunto resultante. En el segundo conjunto, True
está en el primer conjunto, por lo que True
se incluye en el resultado.
Si mira https://docs.python.org/3/library/stdtypes.html#boolean-values sección 4.12.10. Valores booleanos:
Los valores booleanos son los dos objetos constantes Falso y Verdadero . Se utilizan para representar valores de verdad (aunque otros valores también pueden considerarse falsos o verdaderos). En contextos numéricos (por ejemplo, cuando se utilizan como argumento para un operador aritmético), se comportan como los enteros 0 y 1 , respectivamente.