80 votes

Pourquoi le signe '+' n'est-il pas compris par les ensembles Python?

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 ?

92voto

Platinum Azure Points 22380

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

89voto

IfLoop Points 59461

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.

35voto

Giorgio Points 1724

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.

24voto

Mark Ransom Points 132545

Bien sûr, ils auraient pu utiliser + pour faire une union, mais ils auraient encore besoin d'un symbole pour l'intersection. | pour l'union est symétrique avec & pour l'intersection et constitue donc un meilleur choix.

10voto

Winston Ewert Points 17746

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