web-dev-qa-db-fra.com

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 syndicats ci-dessous, les résultats sont différents?

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

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

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

Pourquoi l'union () ne contient pas tous les éléments

1 Et True sont équivalents et sont 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 gardent la première vue:

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

Façons de différencier les valeurs

Pour qu’ils soient traités comme distincts, stockez-les dans une paire (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()

Une autre façon de distinguer les valeurs consiste à les stocker en tant que 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:

C’est la technique standard pour rompre l’équivalence entre types (c.-à-d. 0.0 == 0, True == 1 Et Decimal(8.5) == 8.5). La technique est utilisée dans Python = Le module d'expression régulière de 2.7 pour forcer la mise en cache des expressions rationnelles unicode distinctement des expressions rationnelles str équivalentes. Cette technique est également utilisée dans Python 3 pour functools.lru_cache () lorsque le paramètre typé est true .

Si le terminal opérateur a besoin d'autre chose que la relation d'équivalence par défaut, il faut définir une nouvelle relation. En fonction du cas d'utilisation, il peut s'agir d'une insensibilité à la casse pour les chaînes, d'une normalisation pour l'unicode, d'une apparence visuelle (les éléments qui semblent différents sont considérés comme différent), d'une identité (aucun objet distinct n'est considéré comme identique), d'une paire valeur/type ou de quelque autre fonction qui définit une relation d'équivalence. Étant donné l’exemple spécifique des PO, il semblerait qu’il/elle s’attendait à une distinction par type ou par distinction visuelle.

111
Raymond Hettinger

En Python, False et 0 sont considérés comme équivalents, de même que True et 1. Parce que True et 1 sont considérés comme la même valeur, un seul d'entre eux peut être présent dans un ensemble à la même heure. Lequel dépend de l'ordre dans lequel ils sont ajoutés à l'ensemble. Dans la première ligne, set1 est utilisé comme premier ensemble, nous obtenons donc 1 dans l'ensemble résultant. Dans le second ensemble, True est dans le premier ensemble, donc True est inclus dans le résultat.

21
mcslane

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

Les valeurs booléennes sont les deux objets constants False et True . Ils sont utilisés pour représenter des valeurs de vérité (bien que d'autres valeurs puissent également être considérées comme fausses ou vraies). Dans les contextes numériques (par exemple, lorsqu'ils sont utilisés comme arguments d'un opérateur arithmétique), ils se comportent comme les entiers 0 et 1 , respectivement.

7
chocksaway

L'opérateur de comparaison (==, !=) est défini pour que booléen True et False correspondent à 1 et 0.

C'est pourquoi, dans l'union des ensembles, lorsqu'il 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
5
Uriel