Оператор множества "in" в Python

146

Меня немного смущает inоператор python для наборов.

Если у меня есть набор sи некоторый экземпляр b, это правда , что b in sозначает « есть какой - то элемент xв sтаком , что b == xэтоtrue »?

Дежас
источник
80
Вы математик?
Слишком
13
Специалист в области информатики. Я просто немного сбит с толку, потому что в документации написано «Проверить x на членство в s». Для меня это может означать «экземпляр x содержится в s» или «в s существует некоторый экземпляр, имеющий то же значение, что и x». Я не знаю, сравнение ли это идентичности или равенства.
Dejas 02
6
@Dejas: Поскольку вы знаете, что в Python есть два оператора сравнения равенства и сравнения идентичностей, вы должны иметь возможность построить эксперимент, который подтвердит каждый из них. Было бы полезно, если бы вы разместили этот эксперимент.
S.Lott

Ответы:

101

Да, но это также означает hash(b) == hash(x), что равенства элементов недостаточно, чтобы сделать их одинаковыми.

Игнасио Васкес-Абрамс
источник
14
Итак, «есть ли в s элемент x такой, что hash (b) == hash (x) and x == b»?
Dejas 02
13
Если кто-то реализовал хеш-функцию своего класса извращенным образом, это то, что он может получить (и заслужить).
ugoren 02
86

Вот так. Вы можете попробовать это в интерпретаторе вот так:

>>> 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')

отредактировано: отредактировано для включения наборов, а не списков и строк

Арнаб Гхосал
источник
3
При чем тут наборы?
Игнасио Васкес-Абрамс,
хорошо, я полагаю, что список или даже строка могут иметь свойства, аналогичные множеству. Они представляют собой набор элементов.
Arnab Ghosal
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'. Подумайте о том, чтобы просто удалить этот бессмысленно неправильный ответ.
Quuxplusone
3

Наборы ведут себя иначе, чем dicts, вам нужно использовать операции над наборами, такие как 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
источник
Это интересно. А также отличное приложение для реального мира.
Armstrongest