Operator zbioru „in” w Pythonie

143

Jestem trochę zdezorientowany co do inoperatora Pythona dla zestawów.

Jeśli mam zestaw si jakąś instancję b, czy to prawda, że b in soznacza to „czy jest jakiś element xw stakim, który b == xjesttrue ”?

Dejas
źródło
77
Czy jesteś matematykiem? Opisywanie prostych rzeczy w zbyt złożony sposób ..;)
ThiefMaster
13
Informatyk. Jestem trochę zdezorientowany, ponieważ w dokumentacji jest napisane „Test x dla członkostwa w s”. Dla mnie to może oznaczać „wystąpienie x jest zawarte w s” lub „istnieje jakaś instancja w s, która ma taką samą wartość jak x”. Nie wiem, czy jest to porównanie tożsamości, czy równości.
Dejas
6
@Dejas: Ponieważ zdajesz sobie sprawę, że Python ma dwa operatory Porównanie równości i porównanie tożsamości, powinieneś być w stanie skonstruować eksperyment, który potwierdzi każdy z nich. Pomogłoby, gdybyś opublikował ten eksperyment.
S.Lott,

Odpowiedzi:

101

Tak, ale oznacza to równieżhash(b) == hash(x) , że równość przedmiotów nie wystarczy, aby były takie same.

Ignacio Vazquez-Abrams
źródło
14
Ok, więc "czy istnieje element x w s taki, że hash (b) == hash (x) and x == b"?
Dejas
12
Jeśli ktoś zaimplementował funkcję skrótu swojej klasy w pokręcony sposób, może to dostać (i na to zasługuje).
ugoren
84

Zgadza się. Możesz to wypróbować w tłumaczu w następujący sposób:

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

>>> 'a' in a_set
True

>>>'d' in a_set
False
Niclas Nilsson
źródło
2
Nie jest to zbyt dobry test, ponieważ stałe łańcuchowe są często internowane (spróbuj a = 'a'; b = 'a'; a is b). a = (1, 2, 3); b = (1, 2, 3); a == b; hash(a) == hash(b); a is b; a in set([b])Zamiast tego spróbowałem .
Filip.
11

Tak, może to oznaczać, lub może to być prosty iterator. Na przykład: Przykład jako iterator:

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

Podobnie jak czek:

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

edited: edytowane w celu uwzględnienia zestawów zamiast list i ciągów

Arnab Ghosal
źródło
2
Co to ma wspólnego z zestawami?
Ignacio Vazquez-Abrams
cóż, przypuszczam, że lista lub nawet ciąg znaków można uznać za mające podobne właściwości do zbioru. Są zbiorem elementów.
Arnab Ghosal
1
Nie, zestawy mają dodatkowy warunek sprawdzania zawartości, którego nie mają sekwencje.
Ignacio Vazquez-Abrams
3

Ciągi, choć nie są settypami, mają cenną inwłaściwość podczas walidacji w skryptach:

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

Mam nadzieję, że pomoże ci to lepiej zrozumieć użycie w intym przykładzie.

Droogans
źródło
2
To nie jest zestaw. Ani łańcuchy nie są zmienne.
Ignacio Vazquez-Abrams
7
... or 'e' or 'es' or 's'. Rozważ po prostu usunięcie tej bezsensownie błędnej odpowiedzi.
Quuxplusone
3

Zestawy zachowują się inaczej niż dicts, musisz użyć operacji set, takich jak issubset ():

>>> 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
źródło
To interesujące. A także świetna aplikacja w świecie rzeczywistym.
Armstrongest