programacion potencia lista interseccion entre disjuntos diferencia conjuntos conjunto python python-3.x set equivalence-classes

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.