94 votes

L'union de 2 ensembles ne contient pas tous les éléments

Comment se fait-il que lorsque je change l'ordre des deux ensembles dans les unions ci-dessous, j'obtienne des résultats différents ?

set1 = {1, 2, 3}
set2 = {True, False}

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

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

110voto

Raymond Hettinger Points 50330

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.

20voto

mcslane Points 325

En Python, False y 0 sont considérés comme équivalents, de même que True y 1 . Parce que True y 1 sont considérées comme la même valeur, une seule d'entre elles peut être présente dans un ensemble au même moment. Laquelle dépend de l'ordre dans lequel elles sont ajoutées à l'ensemble. Dans la première ligne, set1 est utilisé comme premier ensemble, on obtient donc 1 dans l'ensemble résultant. Dans le deuxième ensemble, True est dans le premier ensemble, donc True est inclus dans le résultat.

6voto

chocksaway Points 41

Si vous regardez https://docs.python.org/3/library/stdtypes.html#boolean-values section 4.12.10. Les Valeurs Booléennes:

Les valeurs booléennes sont les deux objets constants Faux et Vrai. Ils sont utilisés pour représenter des valeurs de vérité (bien que d'autres valeurs peuvent également être considérés comme de faux ou vrai). Dans des contextes numériques (par exemple, lorsque utilisée comme argument d'un opérateur arithmétique), ils se comportent comme les entiers compris entre 0 et 1, respectivement.

4voto

Uriel Points 10724

L'opérateur de comparaison ( == , != ) est défini pour les booléens True y False pour correspondre à 1 et 0.

C'est pourquoi, dans l'union de l'ensemble, lorsqu'elle vérifie si True est déjà dans le nouvel ensemble, il obtient une réponse véridique :

>>> True in {1}
True
>>> 1 in {True}
True

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X