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?
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?
~fosse un operatore binario, potresti avere |per + unione e ~per differenza, che è molto più bilanciato.
Risposte:
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).
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.
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.
|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.
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.
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.
Perché la differenza di set è un concetto molto utile e comunemente noto, ma non esiste un concetto (universalmente utilizzato) di "addizione di set".
+è 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.
|significa unione. Cosa stai chiedendo?