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 ”?


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.


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

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


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.


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

To interesujące. A także świetna aplikacja w świecie rzeczywistym.
Armstrongest
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.