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}
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:
L' 1
e True
sono equivalenti e considerato duplicati. Allo stesso modo anche i 0
e False
sono equivalenti:
>>> 1 == True
True
>>> 0 == False
True
Quando si incontrano più valori equivalenti, gli insiemi mantengono il primo visto:
>>> {0, False}
{0}
>>> {False, 0}
{False}
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 == 1
e 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.
In Python, False
e 0
sono considerati equivalenti, come lo sono True
e 1
. Perché True
e 1
sono 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 1
nell'insieme risultante. Nel secondo set, True
è nel primo set, quindi True
è incluso nel risultato.
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.