Die Vereinigung von 2 Sätzen enthält nicht alle Elemente

94

Wie kommt es, dass ich unterschiedliche Ergebnisse erhalte, wenn ich die Reihenfolge der beiden Sätze in den folgenden Gewerkschaften ändere?

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

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

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

Antworten:

110

Warum die union () nicht alle Elemente enthält

Die 1und Truesind äquivalent und gelten als Duplikate. Ebenso sind die 0und Falsegleichwertig:

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

Welcher äquivalente Wert wird verwendet?

Wenn mehrere äquivalente Werte gefunden werden, behalten die Sätze den ersten gesehen:

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

Möglichkeiten, die Werte zu unterscheiden

Um sie als unterschiedlich zu behandeln, speichern Sie sie einfach in einem (value, type)Paar:

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

Eine andere Möglichkeit, die Werte zu unterscheiden, besteht darin, sie als Zeichenfolgen zu speichern:

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

Hoffe das klärt das Rätsel und zeigt den Weg nach vorne :-)


Aus den Kommentaren gerettet:

Dies ist die Standardtechnik zum Brechen Quer Typ Äquivalenz (dh 0.0 == 0, True == 1, und Decimal(8.5) == 8.5). Die Technik regelmäßig in Python 2.7 ist an Kraft Unicode Regexes Ausdruck Modul verwendet wird , deutlich von ansonsten äquivalenter str Regexes zwischengespeichert wird. Die Technik wird auch verwendet in Python 3 für functools.lru_cache (), wenn der eingegebene Parameter wahr ist.

Wenn das OP etwas anderes als die Standardäquivalenzbeziehung benötigt, muss eine neue Beziehung definiert werden. Je nach Anwendungsfall kann dies die Groß- und Kleinschreibung für Zeichenfolgen, die Normalisierung für Unicode, das visuelle Erscheinungsbild (Dinge, die anders aussehen, werden als unterschiedlich angesehen), die Identität (keine zwei unterschiedlichen Objekte werden als gleich angesehen), ein Wert / Typ-Paar oder ein anderes sein Funktion, die eine Äquivalenzbeziehung definiert. In Anbetracht des spezifischen Beispiels des OP scheint es, dass er / sie entweder eine Unterscheidung nach Typ oder eine visuelle Unterscheidung erwartet hat.

Raymond Hettinger
quelle
20

In Python Falseund 0werden als gleichwertig angesehen, ebenso wie Trueund 1. Da Trueund 1als der gleiche Wert betrachtet werden, kann nur einer von ihnen gleichzeitig in einer Menge vorhanden sein. Welche hängt von der Reihenfolge ab, in der sie dem Satz hinzugefügt werden. In der ersten Zeile set1wird sie als erste Menge verwendet, sodass wir 1in die resultierende Menge gelangen. Im zweiten Satz Trueist im ersten Satz, so Trueist im Ergebnis enthalten.

mcslane
quelle
6

Wenn Sie sich https://docs.python.org/3/library/stdtypes.html#boolean-values Abschnitt 4.12.10 ansehen. Boolesche Werte:

Boolesche Werte sind die beiden konstanten Objekte False und True . Sie werden verwendet, um Wahrheitswerte darzustellen (obwohl andere Werte auch als falsch oder wahr angesehen werden können). In numerischen Kontexten (z. B. wenn sie als Argument für einen arithmetischen Operator verwendet werden) verhalten sie sich wie die Ganzzahlen 0 bzw. 1 .

chocksaway
quelle
4

Der Vergleichsoperator ( ==, !=) ist für boolean definiert Trueund entspricht False1 und 0.

Deshalb Trueerhält es in der Set-Union eine wahrheitsgemäße Antwort , wenn es prüft, ob es bereits im neuen Set enthalten ist:

>>> True in {1}
True
>>> 1 in {True}
True
Uriel
quelle