Pourquoi l'union () ne contient pas tous les éléments
Les 1
et True
sont équivalents et considérés comme des doublons. De même, 0
et False
sont également équivalents:
>>> 1 == True
True
>>> 0 == False
True
Quelle valeur équivalente est utilisée
Lorsque plusieurs valeurs équivalentes sont rencontrées, les ensembles conservent la première vue:
>>> {0, False}
{0}
>>> {False, 0}
{False}
Façons de différencier les valeurs
Pour les faire traiter comme distincts, stockez-les simplement par (value, type)
paire:
>>> 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()
Une autre façon de différencier les valeurs consiste à les stocker sous forme de chaînes:
>>> set1 = {'1', '2', '3'}
>>> set2 = {'True', 'False'}
>>> set1 | set2
{'2', '3', 'False', 'True', '1'}
>>> set1 & set2
set()
J'espère que cela clarifie le mystère et montre la voie à suivre :-)
Sauvé des commentaires:
Il s'agit de la technique standard pour rompre l'équivalence de type croisé (c. 0.0 == 0
-à- d . True == 1
, EtDecimal(8.5) == 8.5)
. La technique est utilisée dans le module d'expression régulière de Python 2.7 pour forcer les expressions régulières Unicode à être mises en cache distinctement des expressions rationnelles str équivalentes. La technique est également utilisée en Python 3 pour functools.lru_cache () lorsque le paramètre tapé est vrai.
Si l'OP a besoin d'autre chose que la relation d'équivalence par défaut, une nouvelle relation doit être définie. Selon le cas d'utilisation, cela peut être une insensibilité à la casse pour les chaînes, la normalisation pour unicode, l'apparence visuelle (les choses qui semblent différentes sont considérées comme différentes), l'identité (aucun objet distinct n'est considéré comme égal), une paire valeur / type, ou quelque autre fonction qui définit une relation d'équivalence. Compte tenu de l'exemple spécifique des OP, il semblerait qu'il s'attendait à une distinction par type ou à une distinction visuelle.