2012-01-02 6 views
66

Я немного смущен о питоне в операторе для множеств.Оператор набора «in» Python

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

+27

Вы математики? Описывая простые вещи чрезмерно сложным способом.;) – ThiefMaster

+5

Компьютерный ученый. Я немного смущен, потому что в документации говорится «Тест x для членства в s». Для меня это может означать «экземпляр x содержится в s» или «какой-то экземпляр существует в s, который имеет то же значение, что и x». Я не знаю, является ли это сопоставлением идентичности или равенства. – Dejas

+3

@Dejas: Поскольку вы знаете, что у Python есть два сравнения сравнений равенства и идентичности, вы должны иметь возможность построить эксперимент, который подтверждает их. Это поможет, если вы разместите этот эксперимент. –

ответ

55

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

+7

Итак, «есть ли элемент x в s такой, что hash (b) == hash (x) и x == b"? – Dejas

+0

@Dejas: Правильно. –

+4

Если кто-то реализовал хэш-функцию своего класса в искаженном виде, это то, что он может получить (и заслужить). – ugoren

0

Да. Это означает, что данный элемент находится в наборе.

+1

Просто, чтобы быть ясным, хотя. по «находится в наборе» вы имеете в виду «a == b», а не «a is b», правильно? – Dejas

34

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

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

>>> 'a' in a_set 
True 

>>>'d' in a_set 
False 
+3

Fyi, 'sets' устарел. 'set()' является встроенным в течение довольно долгого времени. – ThiefMaster

+0

О, конечно. Извините :) Я меняю свой пример ... –

+0

Это не очень хороший тест, поскольку строковые константы часто интернированы (попробуйте 'a = 'a'; b = 'a'; a is b'). Я попробовал это с помощью 'a = (1, 2, 3); b = (1, 2, 3); a == b; hash (a) == hash (b); a - b; a в наборе ([b]) '. – Philipp

0

строк, хотя они не являются 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 с этим примером.

+1

Это не набор. Также не изменяются строки. –

+0

Я не знаю, о чем думал ... ты прав. – Droogans

+3

'... или 'e' или 'es' или 's''. Подумайте о том, чтобы просто удалить этот бессмысленно неправильный ответ. – Quuxplusone

8

Да, это может означать так, или это может быть простой итератор. Например: пример в качестве итератора:

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

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

+0

Что это связано с наборами? –

+0

хорошо, я полагаю, что список или даже строка могут считаться аналогичными свойствами для набора. Это набор элементов. –

+1

Нет, у наборов есть дополнительное условие для проверки сдерживания, которых нет в последовательности. –

Смежные вопросы