Python的“ in”集合运算符


143

in对集合的python 运算符有些困惑。

如果我有一组s与某些情况下b,是不是真的b in s意味着“ 是有一些因素xs这样b == xtrue ”?


77
你是数学家吗?以过于复杂的方式描述简单的事物..;)
ThiefMaster 2012年

13
电脑科学家。我有点困惑,因为文档中说“测试x的s成员身份”。对我来说,这可能意味着“实例x包含在s中”或“某些实例存在于s中,并且与x具有相同的值”。我不知道这是一个身份比较还是平等比较。
Dejas'1

6
@Dejas:由于您知道Python有两个运算符,即Equality比较和Identity比较,因此您应该能够构造一个实验来确认每个实验。如果您发布该实验会有所帮助。
S.Lott 2012年

Answers:



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
这与集合有什么关系?
伊格纳西奥·巴斯克斯

好吧,我想一个列表甚至一个字符串都可以被认为具有与集合相似的属性。它们是元素的集合。
Arnab Ghosal 2012年

1
不可以,集合还有一个条件,那就是序列检查不能进行遏制检查。
Ignacio Vazquez-Abrams'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 2014年

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

那很有意思。以及出色的实际应用程序。
阿姆斯特朗(Armstrongest)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.