python - potencia - interseccion programacion
La unión de 2 juegos no contiene todos los artículos. (4)
Por qué la unión () no contiene todos los elementos
El
1
y
True
son equivalentes y se consideran duplicados.
Del mismo modo, el
0
y
False
son equivalentes:
>>> 1 == True
True
>>> 0 == False
True
Qué valor equivalente se usa
Cuando se encuentran múltiples valores equivalentes, los conjuntos mantienen el primero visto:
>>> {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 par
(value, type)
:
>>> 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 hacer que los valores sean distintos 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 utiliza en el módulo de expresión regular de Python 2.7 para forzar que las expresiones regulares unicode se almacenen en caché de manera diferente de 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 se debe definir alguna relación nueva. Dependiendo del caso de uso, eso podría ser la insensibilidad de mayúsculas y minúsculas para las cadenas, la normalización para unicode, la apariencia visual (las cosas que se ven diferentes se consideran diferentes), la identidad (no hay dos objetos distintos considerados iguales), un par valor / tipo u otro función que define una relación de equivalencia. Dado el ejemplo específico de los OP, parecería que esperaba una distinción por tipo o distinción visual.
¿Cómo es que cuando cambio el orden de los dos conjuntos en las uniones a continuación, obtengo resultados diferentes?
set1 = {1, 2, 3}
set2 = {True, False}
print(set1 | set2)
# {False, 1, 2, 3}
print(set2 | set1)
#{False, True, 2, 3}
El operador de comparación (
==
!=
) Se define para booleano
True
y
False
para que coincida con 1 y 0.
Es por eso que, en la unión de conjuntos, cuando verifica si
True
ya está en el nuevo conjunto, obtiene una respuesta verdadera:
>>> True in {1}
True
>>> 1 in {True}
True
En Python,
False
y
0
se consideran equivalentes, al igual que
True
y
1
.
Como
True
y
1
se consideran el 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 el primer conjunto, por lo que obtenemos
1
en 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 usan para representar valores de verdad (aunque otros valores también pueden considerarse falsos o verdaderos). En contextos numéricos (por ejemplo, cuando se usa como argumento para un operador aritmético), se comportan como los enteros 0 y 1 , respectivamente.