Je voudrais savoir pourquoi c'est valable:
set(range(10)) - set(range(5))
mais ce n'est pas valide:
set(range(10)) + set(range(5))
Est-ce parce que «+» pourrait signifier à la fois intersection et union?
Je voudrais savoir pourquoi c'est valable:
set(range(10)) - set(range(5))
mais ce n'est pas valide:
set(range(10)) + set(range(5))
Est-ce parce que «+» pourrait signifier à la fois intersection et union?
~
était un opérateur binaire, alors vous pourriez avoir |
pour + union, et ~
pour différence, ce qui est beaucoup plus équilibré.
Réponses:
Les ensembles Python n'ont pas d'implémentation pour l' +
opérateur.
Vous pouvez utiliser |
pour l'union d'ensemble et &
pour l'intersection d'ensemble.
Les ensembles implémentent -
comme différence d'ensemble. Vous pouvez également utiliser ^
pour la différence d'ensemble symétrique (c'est-à-dire qu'il renverra un nouvel ensemble avec uniquement les objets qui apparaissent dans un ensemble mais n'apparaissent pas dans les deux ensembles).
Python a choisi d'utiliser |
au lieu de +
car set union est un concept étroitement lié à la disjonction booléenne; Les vecteurs de bits (qui en python sont juste int
/ long
) définissent cette opération à travers une séquence de valeurs booléennes et l'appellent "bitwise or". En fait, cette opération est si similaire à l'union d'ensemble que les entiers binaires sont parfois aussi appelés «ensembles de bits», où les éléments de l'ensemble sont considérés comme des nombres naturels.
Parce que int
définit déjà les opérateurs de type ensemble comme |
, &
et ^
, il était naturel que le nouveau set
type utilise la même interface.
En théorie des ensembles, le symbole + indique normalement l' union disjointe de deux ensembles. Si A et B sont des ensembles, leur union disjointe est définie comme l'ensemble
A + B = {(a, 1) | a in A} U {(b, 2) | b in B}
c'est-à-dire que pour construire l'union disjointe, nous marquons tous les éléments de A et tous les éléments de B avec des balises différentes (dans l'exemple, j'ai utilisé les nombres 1 et 2, mais deux «choses» différentes feraient l'affaire) et prenons ensuite le union des deux ensembles résultants. Dans l'exemple ci-dessus, j'ai utilisé «U» pour l'union d'ensemble afin de la rendre plus similaire à la notation mathématique habituelle; ci-dessous, j'utilise la notation Python, c'est-à-dire '|' pour l'union et '&' pour l'intersection.
Si A et B sont disjoints, le A + B a une correspondance 1 à 1 avec A | B. S'ils ne le sont pas, alors tous les éléments communs x dans A & B apparaissent deux fois dans A + B: une fois comme (x, 1), et une fois comme (x, 2).
Donc, comme le symbole «+» a une signification assez bien établie en tant qu'opération d'ensemble, je trouve très cohérent que Python n'utilise pas ce symbole pour l'union d'ensemble ou l'intersection. Les concepteurs Python avaient probablement cela à l'esprit lorsqu'ils ont choisi les opérateurs d'ensemble.
|
opérateur pour les unions d'ensemble, mais je n'ai pas compris pourquoi Guido avait évité de surcharger l' +
opérateur pour les unions d'ensemble. Après tout, cela aurait préservé l'orthogonalité avec l' +
opérateur surchargé pour les ajouts de liste. Puisque la marque de Python est la conformité à la notation mathématique (par exemple, j
désignant la composante complexe des nombres complexes), le choix curieux de Guido prend enfin du sens.
Bien sûr, ils auraient pu +
faire une union, mais ils auraient alors encore besoin d'un symbole pour l'intersection. |
car l'union est symétrique avec &
pour intersection et fait donc un meilleur choix.
Parce que |
signifie union et &
signifie intersection. Il n'y a clairement aucune raison d'ajouter plusieurs opérateurs pour la même fonction.
Les raisons d'utiliser |
et &
remonte probablement aux opérations au niveau du bit. Si vous représentez un ensemble sous forme de bits dans un nombre, ce sont les opérateurs que vous utiliseriez pour réaliser l'union et l'intersection.
+
simple n'est pas aussi lié à l'union et -
consiste à faire la différence.
Parce que la différence d'ensemble est un concept très utile et communément connu, mais il n'y a pas de concept (universellement utilisé) d '«addition d'ensemble».
+
est défini comme un ajout par membre . Certains l'utilisent pour une différence symétrique . Quoi qu'il en soit, tout papier qui l'utilise l'appelle autre chose ou le définit en premier.
|
signifie union. Que demandez-vous?