Pythons "In" -Set-Operator

143

Ich bin etwas verwirrt über den Python- inOperator für Sets.

Wenn ich einen Satz habe sund einig Beispiel b, ist es wahr , dass b in sMittel „ ist es ein Element xin sso dass b == xisttrue “?

Dejas
quelle
77
Bist du ein Mathematiker? Einfache Dinge auf übermäßig komplexe Weise beschreiben ..;)
ThiefMaster
13
Informatiker. Ich bin nur ein wenig verwirrt, weil in der Dokumentation "Test x auf Mitgliedschaft in s" steht. Für mich könnte dies bedeuten, dass "die Instanz x in s enthalten ist" oder "eine Instanz in s existiert, die denselben Wert wie x hat". Ich weiß nicht, ob dies ein Identitäts- oder Gleichheitsvergleich ist.
Dejas
6
@Dejas: Da Sie wissen, dass Python zwei Operatoren hat: Gleichheitsvergleich und Identitätsvergleich, sollten Sie in der Lage sein, ein Experiment zu erstellen, das jedes bestätigt. Es wäre hilfreich, wenn Sie dieses Experiment veröffentlichen würden.
S.Lott

Antworten:

101

Ja, aber es auch Mittel hash(b) == hash(x), um die Gleichheit der Elemente nicht genug ist , ihnen das gleiche zu machen.

Ignacio Vazquez-Abrams
quelle
14
Ok, also "gibt es ein Element x in s, so dass Hash (b) == Hash (x) und x == b"?
Dejas
12
Wenn jemand die Hash-Funktion seiner Klasse auf verdrehte Weise implementiert hat, kann er dies erhalten (und verdienen).
Ugoren
84

Das stimmt. Sie können es im Dolmetscher folgendermaßen versuchen:

>>> a_set = set(['a', 'b', 'c'])

>>> 'a' in a_set
True

>>>'d' in a_set
False
Niclas Nilsson
quelle
2
Dies ist kein sehr guter Test, da Zeichenfolgenkonstanten häufig interniert werden (Versuch a = 'a'; b = 'a'; a is b). Ich habe es a = (1, 2, 3); b = (1, 2, 3); a == b; hash(a) == hash(b); a is b; a in set([b])stattdessen mit versucht .
Philipp
11

Ja, das kann so sein, oder es kann ein einfacher Iterator sein. Zum Beispiel: Beispiel als Iterator:

a=set(['1','2','3'])
for x in a:
 print ('This set contains the value ' + x)

Ähnlich wie bei einem Scheck:

a=set('ILovePython')
if 'I' in a:
 print ('There is an "I" in here')

bearbeitet: bearbeitet, um Mengen anstelle von Listen und Zeichenfolgen einzuschließen

Arnab Ghosal
quelle
2
Was hat das mit Sets zu tun?
Ignacio Vazquez-Abrams
Nun, ich nehme an, eine Liste oder sogar eine Zeichenfolge kann ähnliche Eigenschaften wie eine Menge haben. Sie sind eine Sammlung von Elementen.
Arnab Ghosal
1
Nein, Sets haben eine zusätzliche Bedingung für eine Containment-Prüfung, die Sequenzen nicht haben.
Ignacio Vazquez-Abrams
3

Obwohl es sich bei den Zeichenfolgen nicht um setTypen handelt, haben sie inwährend der Validierung in Skripten eine wertvolle Eigenschaft:

yn = input("Are you sure you want to do this? ")
if yn in "yes":
    #accepts 'y' OR 'e' OR 's' OR 'ye' OR 'es' OR 'yes'
    return True
return False

Ich hoffe, dies hilft Ihnen dabei, die Verwendung indieses Beispiels besser zu verstehen .

Droogans
quelle
2
Das ist kein Set. Strings sind auch nicht veränderlich.
Ignacio Vazquez-Abrams
7
... or 'e' or 'es' or 's'. Löschen Sie einfach diese sinnlos falsche Antwort.
Quuxplusone
3

Sets verhalten sich anders als Diktate. Sie müssen Set-Operationen wie issubset () verwenden:

>>> k
{'ip': '123.123.123.123', 'pw': 'test1234', 'port': 1234, 'debug': True}
>>> set('ip,port,pw'.split(',')).issubset(set(k.keys()))
True
>>> set('ip,port,pw'.split(',')) in set(k.keys())
False
MortenB
quelle
Das ist interessant. Und eine großartige reale Anwendung.
Armstrongest