Оператор набору "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.