Je voudrais savoir pourquoi ceci est valide :
set(range(10)) - set(range(5))
mais ceci 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 ceci est valide :
set(range(10)) - set(range(5))
mais ceci n'est pas valide :
set(range(10)) + set(range(5))
Est-ce parce que '+' pourrait signifier à la fois intersection et union ?
Les ensembles Python n'ont pas d'implémentation pour l'opérateur +
.
Vous pouvez utiliser |
pour l'union des ensembles et &
pour l'intersection des ensembles.
Les ensembles implémentent -
comme différence d'ensemble. Vous pouvez également utiliser ^
pour la différence symétrique des ensembles (c'est-à-dire qu'elle renverra un nouvel ensemble avec uniquement les objets qui apparaissent dans un ensemble mais pas dans les deux ensembles).
Python a choisi d'utiliser |
au lieu de +
car l'union d'ensembles est un concept étroitement lié à la disjonction booléenne ; les vecteurs de bits (qui en python sont simplement des int
/long
) définissent cette opération à travers une séquence de valeurs booléennes et l'appellent "or logique". En fait, cette opération est si similaire à l'union d'ensembles que les entiers binaires sont parfois aussi appelés "ensembles de bits", où les éléments de l'ensemble sont considérés comme les nombres naturels.
Comme int
définit déjà des opérateurs de type ensemble tels que |
, &
et ^
, il était naturel pour le nouveau type set
d'utiliser 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 dans A} U {(b, 2) | b dans B}
c'est-à-dire, 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 n'importe quelles deux "choses" différentes ferait l'affaire) puis nous prenons l'union des deux ensembles résultants. Dans l'exemple ci-dessus, j'ai utilisé 'U' pour l'union d'ensembles pour le 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, l'union 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).
Ainsi, puisque le symbole '+' a une signification assez bien établie en tant qu'opération sur les ensembles, je trouve très cohérent que Python n'utilise pas ce symbole pour l'union ou l'intersection d'ensembles. Probablement que le ou les concepteurs de Python avaient cela en tête lorsqu'ils ont choisi les opérateurs d'ensembles.
Parce que |
signifie union et &
signifie intersection. Il n'y a clairement aucune raison d'ajouter de multiples opérateurs pour la même fonction.
Les raisons d'utiliser |
et &
remontent probablement aux opérations sur les bits. Si vous représentez un ensemble comme les bits dans un nombre, ce sont les opérateurs que vous utiliseriez pour faire l'union et l'intersection.
+
n'est tout simplement pas aussi lié à l'union et -
l'est à la différence ensembliste.
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.