Оператор набору "in" Python


143

Я трохи розгублений щодо inоператора python для наборів.

Якщо у мене є набір sі якийсь екземпляр b, чи правда це b in sозначає, " чи є якийсь елемент xу sтакому, який b == xєtrue "?


77
Ви математик? Опис простих речей надмірно складним способом ..;)
ThiefMaster

13
Вчений-комп’ютер. Я просто трохи розгублений, бо в документації написано "Тест x на членство в s". Для мене це може означати, що "екземпляр x міститься в s" або "деякий екземпляр існує в s, який має те саме значення, що і x". Я не знаю, чи це порівняння тотожності чи рівності.
Деяс

6
@Dejas: Оскільки ви знаєте, що Python має два оператори порівняння рівності та порівняння ідентичності, ви повинні мати можливість побудувати експеримент, який підтверджує кожного. Це допоможе, якщо ви опублікували цей експеримент.
С.Лотт

Відповіді:


101

Так, але це також означає hash(b) == hash(x), що рівності елементів недостатньо, щоб зробити їх однаковими.


14
Гаразд, "чи є елемент x у s таким, що хеш (b) == хеш (х) і х == б"?
Деяс

12
Якщо хтось реалізував хеш-функції свого класу крученим способом, це він може отримати (і заслужити).
угорен

84

Це вірно. Ви можете спробувати його в перекладачі так:

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

>>> 'a' in a_set
True

>>>'d' in a_set
False

2
Це не дуже хороший тест, оскільки рядкові константи часто інтерновані (спробуйте 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])замість цього.
Філіп

11

Так, це може означати так, або це може бути простий ітератор. Наприклад: Приклад як ітератор:

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

Точно так само, як і чек:

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

редагується: редагується, щоб включати набори, а не списки та рядки


2
Що це стосується наборів?
Ігнасіо Васкес-Абрамс

добре, я вважаю, що список чи навіть рядок можна вважати такими, що мають властивості набору. Вони є сукупністю елементів.
Арнаб Госал

1
Ні, набори мають додаткову умову для перевірки стримування, щоб послідовності не виконували.
Ігнасіо Васкес-Абрамс

3

Струни, хоч і не є setтипом, мають цінну inвластивість під час перевірки в сценаріях:

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

Я сподіваюся, що це допоможе вам краще зрозуміти використання inцього прикладу.


2
Це не набір. Також рядки не змінюються.
Ігнасіо Васкес-Абрамс

7
... or 'e' or 'es' or 's'. Подумайте просто видалити цю безглуздо відповідь.
Квомплусон

3

Набори поводяться інакше, ніж дикти, вам потрібно використовувати такі операції, як 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

Це цікаво. І чудовий додаток у реальному світі.
Армстронгест
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.