L'unione di 2 set non contiene tutti gli articoli


94

Come mai quando cambio l'ordine dei due set nelle unioni sottostanti, ottengo risultati diversi?

set1 = {1, 2, 3}
set2 = {True, False}

print(set1 | set2)
# {False, 1, 2, 3}

print(set2 | set1)
#{False, True, 2, 3}

Risposte:


110

Perché la union () non contiene tutti gli elementi

L' 1e Truesono equivalenti e considerato duplicati. Allo stesso modo anche i 0e Falsesono equivalenti:

>>> 1 == True
True
>>> 0 == False
True

Quale valore equivalente viene utilizzato

Quando si incontrano più valori equivalenti, gli insiemi mantengono il primo visto:

>>> {0, False}
{0}
>>> {False, 0}
{False}

Modi per distinguere i valori

Per farli essere trattati come distinti, è sufficiente conservarli in (value, type)coppia:

>>> set1 = {(1, int), (2, int), (3, int)}
>>> set2 = {(True, bool), (False, bool)}
>>> set1 | set2
{(3, <class 'int'>), (1, <class 'int'>), (2, <class 'int'>),
 (True, <class 'bool'>), (False, <class 'bool'>)}
>>> set1 & set2
set()

Un altro modo per distinguere i valori è memorizzarli come stringhe:

>>> set1 = {'1', '2', '3'}
>>> set2 = {'True', 'False'}
>>> set1 | set2
{'2', '3', 'False', 'True', '1'}
>>> set1 & set2
set()

Spero che questo chiarisca il mistero e mostri la via da seguire :-)


Salvato dai commenti:

Questa è la tecnica standard per rompere l'equivalenza di tipi incrociati (ad esempio 0.0 == 0, True == 1e Decimal(8.5) == 8.5). La tecnica è usata nel modulo delle espressioni regolari di Python 2.7 per forzare la memorizzazione nella cache delle espressioni regolari unicode distintamente dalle espressioni regolari str altrimenti equivalenti. La tecnica è usata anche in Python 3 per functools.lru_cache () quando il parametro digitato è vero.

Se l'OP ha bisogno di qualcosa di diverso dalla relazione di equivalenza predefinita, è necessario definire una nuova relazione. A seconda del caso d'uso, potrebbe trattarsi di insensibilità al maiuscolo / minuscolo per le stringhe, normalizzazione per Unicode, aspetto visivo (le cose che sembrano diverse sono considerate diverse), identità (non ci sono due oggetti distinti considerati uguali), una coppia valore / tipo o qualche altro funzione che definisce una relazione di equivalenza. Dato l'esempio specifico del PO, sembrerebbe che si aspettasse una distinzione per tipo o distinzione visiva.


20

In Python, Falsee 0sono considerati equivalenti, come lo sono Truee 1. Perché Truee 1sono considerati lo stesso valore, solo uno di essi può essere presente in un insieme allo stesso tempo. Quale dipende dall'ordine in cui vengono aggiunti all'insieme. Nella prima riga, set1è usato come primo insieme, quindi entriamo 1nell'insieme risultante. Nel secondo set, Trueè nel primo set, quindi Trueè incluso nel risultato.


6

Se guardi https://docs.python.org/3/library/stdtypes.html#boolean-values sezione 4.12.10. Valori booleani:

I valori booleani sono i due oggetti costanti False e True . Sono usati per rappresentare valori di verità (sebbene anche altri valori possano essere considerati falsi o veri). In contesti numerici (ad esempio quando usati come argomento di un operatore aritmetico), si comportano come gli interi 0 e 1 , rispettivamente.


4

L'operatore di confronto ( ==, !=) è definito per booleano Truee Falsecorrisponde a 1 e 0.

Ecco perché, nell'unione dell'insieme, quando controlla se Trueè già nel nuovo insieme, ottiene una risposta veritiera:

>>> True in {1}
True
>>> 1 in {True}
True
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.