Unión de 2 juegos no contiene todos los elementos

94

¿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}
Blueplastic
fuente

Respuestas:

110

Por qué la unión () no contiene todos los elementos

Los 1y Trueson equivalentes y se consideran duplicados. Asimismo, 0y también Falseson 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 == 1y 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.

Raymond Hettinger
fuente
20

En Python, Falsey 0se consideran equivalentes, al igual que Truey 1. Debido a que Truey 1se 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, set1se usa como primer conjunto, por lo que obtenemos 1el conjunto resultante. En el segundo conjunto, Trueestá en el primer conjunto, por lo que Truese incluye en el resultado.

McSlane
fuente
6

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.

chocksaway
fuente
4

El operador de comparación ( ==, !=) está definido para booleano Truey Falsepara que coincida con 1 y 0.

Es por eso que, en la unión de conjuntos, cuando verifica si ya Trueestá en el nuevo conjunto, obtiene una respuesta veraz:

>>> True in {1}
True
>>> 1 in {True}
True
Uriel
fuente