Perché '+' non viene compreso dai set Python?


91

Vorrei sapere perché è valido:

set(range(10)) - set(range(5))

ma questo non è valido:

set(range(10)) + set(range(5))

È perché "+" potrebbe significare sia intersezione che unione?


3
|significa unione. Cosa stai chiedendo?
S.Lott

14
È perché Guido ha scelto operatori diversi per l'intersezione e l'unione.
David Heffernan

3
@David Heffernan, Guido di solito non fa le cose senza una ragione o almeno un principio guida - questo è ciò che rende Python così eccezionale.
Mark Ransom

1
@ Mark Oh, sono abbastanza sicuro che l'abbia fatto per una buona ragione.
David Heffernan

1
Se solo ~fosse un operatore binario, potresti avere |per + unione e ~per differenza, che è molto più bilanciato.
Matt Joiner

Risposte:


113

I set Python non hanno un'implementazione per l' +operatore.

È possibile utilizzare |per l'unione di gruppo e &per l'intersezione di gruppo.

Gli insiemi vengono implementati -come differenze di insiemi. Puoi anche usare ^per la differenza di set simmetrico (cioè, restituirà un nuovo set con solo gli oggetti che appaiono in un set ma non compaiono in entrambi i set).


2
Grazie. Non sapevo di | e &.
badzil

100

Python ha scelto di usare |invece di +perché set union è un concetto strettamente correlato alla disgiunzione booleana; I vettori di bit (che in Python sono solo int/ long) definiscono questa operazione attraverso una sequenza di valori booleani e la chiamano "bitwise or". Infatti questa operazione è così simile all'unione di insiemi che gli interi binari sono talvolta chiamati anche "insiemi di bit", dove gli elementi dell'insieme sono considerati numeri naturali.

Poiché intdefinisce già operatori di tipo set come |, &e ^, era naturale che il settipo più recente usasse la stessa interfaccia.


7
Penso che questa risposta affronti meglio il "perché" nella domanda.
Greg Hendershott

1
Probabilmente. +1 per il perché. In un certo senso, però, almeno il richiedente della domanda sembrava soddisfatto solo di sapere come fare l'unione e l'intersezione.
Platinum Azure

2
@ Platinum: mi piace rispondere alla domanda effettivamente posta, quindi quando arriva qualcun altro che ha quella domanda può vedere tutte le risposte ragionevoli; anche se la persona che ha posto la domanda originale è andata avanti. Tra noi due rispondiamo bene.
SingleNegationElimination

1
@TokenMacGuy: "Perché Python semplicemente non ha definito l'operatore" risponde anche al perché. :-P
Platinum Azure

15
Non sono sicuro che lo faccia; "Perché è blu" non spiega "Perché il cielo è blu?"
SingleNegationElimination

36

Nella teoria degli insiemi il simbolo + normalmente indica l' unione disgiunta di due insiemi. Se A e B sono insiemi, la loro unione disgiunta è definita come l'insieme

A + B = {(a, 1) | a in A} U {(b, 2) | b in B}

cioè, per costruire l'unione disgiunta, contrassegniamo tutti gli elementi di A e tutti gli elementi di B con tag diversi (nell'esempio ho usato i numeri 1 e 2, ma due "cose" diverse farebbero il lavoro) e quindi prendiamo il unione dei due insiemi risultanti. Nell'esempio precedente, ho usato "U" per l'unione degli insiemi per renderlo più simile alla solita notazione matematica; di seguito utilizzo la notazione Python, cioè '|' per l'unione e "&" per l'intersezione.

Se A e B sono disgiunti, A + B ha una corrispondenza 1 a 1 con A | B. Se non lo sono, tutti gli elementi comuni x in A e B appaiono due volte in A + B: una volta come (x, 1) e una volta come (x, 2).

Quindi, poiché il simbolo '+' ha un significato abbastanza ben definito come operazione di insiemi, trovo molto coerente che Python non usi questo simbolo per l'unione o l'intersezione degli insiemi. Probabilmente i progettisti di Python lo avevano in mente quando hanno scelto gli operatori set.


5
Questa è la risposta ottimale. Fino a quando non ho letto questa risposta, mi sono lamentato del motivo per cui Guido ha sovraccaricato l' |operatore per le unioni di gruppo, ma non sono riuscito a capire perché Guido ha evitato di sovraccaricare l' +operatore anche per le unioni di gruppo. Dopotutto, così facendo si sarebbe preservata l'ortogonalità con l' +operatore sovraccarico per le aggiunte alla lista. Poiché il segno distintivo di Python è la conformità con la notazione matematica (ad esempio, che jdenota la componente complessa dei numeri complessi), la curiosa scelta di Guido ha finalmente un senso.
Cecil Curry

23

Certo, avrebbero potuto +fare un'unione, ma poi avrebbero comunque bisogno di un simbolo per l'intersezione. |poiché l'unione è simmetrica con l' &intersezione e quindi rappresenta una scelta migliore.


10

Perché |significa unione e &significa intersezione. Non c'è chiaramente alcun motivo per aggiungere più operatori per la stessa funzione.

Le ragioni per l'utilizzo |e &probabilmente risalgono alle operazioni bit per bit. Se rappresenti un insieme come i bit in un numero, questi sono gli operatori che useresti per fare l'unione e l'intersezione.

+semplice non è così legato all'unione ed -è stabilire la differenza.


3

Perché la differenza di set è un concetto molto utile e comunemente noto, ma non esiste un concetto (universalmente utilizzato) di "addizione di set".


1
Unione? Quando è stata l'ultima volta che hai sentito qualcuno dire "aggiunta di un insieme" invece di "unione", o usare + invece di ∪ ?. A volte +è definito come aggiunta in termini di membri . Alcuni lo usano per la differenza simmetrica . In ogni caso, qualsiasi carta che lo utilizza lo chiama qualcos'altro o lo definisce per primo.
Petr Viktorin

1
Qualcuno potrebbe chiamarlo "aggiunta di set" se non conosce il termine corretto. Ovviamente le persone che conoscono il termine "unione" usano il termine "unione".
soffice
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.