Pourquoi l'union() ne contient pas tous les éléments
El 1
y True
sont équivalents et considérés comme des doublons. De même, les 0
y False
sont également équivalentes :
>>> 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 rendre les valeurs distinctes
Pour qu'ils soient traités comme des éléments distincts, il suffit de les stocker dans un fichier de type (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 rendre les valeurs distinctes est de les stocker sous forme de chaînes de caractères :
>>> set1 = {'1', '2', '3'}
>>> set2 = {'True', 'False'}
>>> set1 | set2
{'2', '3', 'False', 'True', '1'}
>>> set1 & set2
set()
J'espère que cela éclaircira le mystère et montrera la voie à suivre :-)
Sauvé des commentaires :
Il s'agit de la technique standard pour briser l'équivalence de type croisé (c.-à-d. 0.0 == 0
, True == 1
y Decimal(8.5) == 8.5)
. Cette technique est utilisée dans le module d'expression régulière de Python 2.7 pour forcer les regex unicode à être mis en cache de manière distincte des regex str autrement équivalentes. Cette technique est également utilisée dans Python 3 pour functools.lru_cache() lorsque le paramètre typed est vrai.
Si le PO a besoin de quelque chose d'autre que la relation d'équivalence par défaut, alors une nouvelle relation doit être définie. En fonction du cas d'utilisation, cela pourrait être l'insensibilité à la casse pour les chaînes de caractères, la normalisation pour l'unicode, l'apparence visuelle (les choses qui semblent différentes sont considérées comme différentes), l'identité (deux objets distincts ne sont pas considérés comme égaux), une paire valeur/type, ou une autre fonction qui définit une relation d'équivalence. Compte tenu de l'exemple spécifique du PO, il semblerait qu'il/elle s'attendait à une distinction par type ou à une distinction visuelle.