Pourquoi «+» n'est-il pas compris par les ensembles Python?

90

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?

Badzil
la source
3
|signifie union. Que demandez-vous?
S.Lott
13
C'est parce que Guido a choisi différents opérateurs pour l'intersection et l'union.
David Heffernan
3
@David Heffernan, Guido ne fait généralement pas les choses sans raison ou au moins un principe directeur - c'est ce qui rend Python si génial.
Mark Ransom
1
@Mark Oh, je suis sûr qu'il l'a fait pour une bonne raison.
David Heffernan
1
Si seulement ~était un opérateur binaire, alors vous pourriez avoir |pour + union, et ~pour différence, ce qui est beaucoup plus équilibré.
Matt Joiner

Réponses:

109

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).

Platine Azure
la source
2
Merci. Je ne savais pas | et &.
badzil
99

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 intdéfinit déjà les opérateurs de type ensemble comme |, &et ^, il était naturel que le nouveau settype utilise la même interface.

SingleNegationElimination
la source
7
Je pense que cette réponse répond mieux au «pourquoi» de la question.
Greg Hendershott
1
Probablement. +1 pour le pourquoi. Dans un sens cependant, au moins le poseur de question semblait satisfait de savoir comment faire l'union et l'intersection.
Platinum Azure
2
@Platinum: J'aime répondre à la question réellement posée, donc quand quelqu'un d'autre vient avec cette question peut voir toutes les réponses raisonnables; même si la personne qui a posé la question initiale est passée à autre chose. Entre nous deux, nous y répondons bien.
SingleNegationElimination
1
@TokenMacGuy: "Parce que Python n'a tout simplement pas défini l'opérateur" répond également au pourquoi. :-P
Platinum Azure
15
Je ne suis pas sûr que ce soit le cas; "Parce qu'il est bleu" n'explique pas "Pourquoi le ciel est-il bleu?"
SingleNegationElimination
36

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.

Giorgio
la source
5
C'est la réponse optimale. Jusqu'à la lecture de cette réponse, j'ai compris pourquoi Guido avait surchargé l' |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, jdésignant la composante complexe des nombres complexes), le choix curieux de Guido prend enfin du sens.
Cecil Curry
23

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.

Mark Ransom
la source
10

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.

Winston Ewert
la source
3

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».

Petr Viktorin
la source
1
Syndicat? À quand remonte la dernière fois que vous avez entendu quelqu'un dire «set addition» au lieu de «union», ou utiliser + au lieu de ∪ ?. Parfois, il +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.
Petr Viktorin
1
Quelqu'un pourrait l'appeler «addition d'ensemble» s'il ne connaît pas le terme approprié. De toute évidence, les gens qui connaissent le terme «syndicat» utilisent le terme «syndicat».
pelucheux