Union van 2 sets bevat niet alle items

Hoe komt het dat ik verschillende resultaten krijg als ik de volgorde van de twee sets in de onderstaande vakbonden verander?

set1 = {1, 2, 3}
set2 = {True, False}
print(set1 | set2)
# {False, 1, 2, 3}
print(set2 | set1)
#{False, True, 2, 3}

Antwoord 1, autoriteit 100%

Waarom de union() niet alle items bevat

De 1en Truezijn equivalent en worden als duplicaten beschouwd. Evenzo zijn de 0en Falseook equivalent:

>>> 1 == True
True
>>> 0 == False
True

Welke equivalente waarde wordt gebruikt

Als meerdere equivalente waarden worden aangetroffen, houden sets de eerste zichtbaar:

>>> {0, False}
{0}
>>> {False, 0}
{False}

Manieren om de waarden duidelijk te maken

Om ze als onderscheiden te laten behandelen, slaat u ze op in een (value, type)-paar:

>>> 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()

Een andere manier om de waarden te onderscheiden is door ze op te slaan als strings:

>>> set1 = {'1', '2', '3'}
>>> set2 = {'True', 'False'}
>>> set1 | set2
{'2', '3', 'False', 'True', '1'}
>>> set1 & set2
set()

Ik hoop dat dit het mysterie opheldert en de weg vooruit toont 🙂


Gered uit de reacties:

Dit is de standaardtechniek voor het doorbreken van equivalentie tussen typen (dwz 0.0 == 0, True == 1en Decimal(8.5) == 8.5). De techniek wordt gebruikt in de reguliere expressiemodule van Python 2.7 om ervoor te zorgen dat unicode-regexes duidelijk in de cache worden opgeslagen van anderszins gelijkwaardige str-regexes. De techniek wordt ook gebruikt in Python 3 voor functools.lru_cache() wanneer de getypte parameter waar is.

Als het OP iets anders nodig heeft dan de standaard equivalentierelatie, dan moet er een nieuwe relatie worden gedefinieerd. Afhankelijk van het gebruik kan dat hoofdletterongevoeligheid zijn voor tekenreeksen, normalisatie voor unicode, visuele verschijning (dingen die er anders uitzien, worden als verschillend beschouwd), identiteit (geen twee verschillende objecten worden als gelijk beschouwd), een waarde/type-paar of een ander functie die een equivalentierelatie definieert. Gezien het specifieke voorbeeld van de OP’s, lijkt het erop dat hij/zij onderscheid naar type of visueel onderscheid verwacht.


Antwoord 2, autoriteit 18%

In Python worden Falseen 0als equivalent beschouwd, evenals Trueen 1. Omdat Trueen 1als dezelfde waarde worden beschouwd, kan er slechts één van hen tegelijkertijd in een set aanwezig zijn. Welke hangt af van de volgorde waarin ze aan de set zijn toegevoegd. In de eerste regel wordt set1gebruikt als de eerste set, dus we krijgen 1in de resulterende set. In de tweede set zit Truein de eerste set, dus Trueis opgenomen in het resultaat.


Antwoord 3, autoriteit 5%

Als je kijkt naar https://docs.python.org/ 3/library/stdtypes.html#boolean-valuessectie 4.12.10. Booleaanse waarden:

Booleaanse waarden zijn de twee constante objecten False en True. Ze worden gebruikt om waarheidswaarden weer te geven (hoewel andere waarden ook als onwaar of waar kunnen worden beschouwd). In numerieke contexten (bijvoorbeeld wanneer ze worden gebruikt als argument voor een rekenkundige operator), gedragen ze zich respectievelijk als de gehele getallen 0 en 1.

Other episodes