Python的"in"集合运算符

Dej*_*jas 123 python

我对运算符中的python有点困惑.

如果我有蟒蛇一组in和某些情况下s,是不是真的b意味着"是有一些因素b in sx这样sb == x"?

Ign*_*ams 92

是的,但这意味着hash(b) == hash(x),所以项目的相等性不足以使它们相同.

  • 好的,"s中是否有一个元素x,以便hash(b)== hash(x)和x == b"? (14认同)
  • 如果有人以扭曲的方式实现了他的类的哈希函数,那么这就是他可能得到的(并且值得). (12认同)
  • @Dejas:是的。 (4认同)
  • 我认为关于[成员资格测试](https://docs.python.org/3.9/reference/expressions.html#membership-test-operations)的文档应该更清楚地说明哈希相等性是“set”、“ freezeset` 和 `dict`。2015 年的错误报告中讨论了类似的改进,但不幸的是它在 2019 年被关闭:https://bugs.python.org/issue23987#msg241661。 (2认同)

Nic*_*son 72

那就对了.您可以在解释器中尝试这样:

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

>>> 'a' in a_set
True

>>>'d' in a_set
False
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个很好的测试,因为字符串常量经常被插入(试试 `a = 'a'; b = 'a'; a is b`)。我用 `a = (1, 2, 3); b = (1, 2, 3); a == b; 哈希(a) == 哈希(b); a 是 b;a in set([b])` 代替。 (2认同)

Arn*_*sal 10

是的,它可以意味着,或者它可以是一个简单的迭代器.例如:作为迭代器的示例:

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

同样作为检查:

a=set('ILovePython')
if 'I' in a:
 print ('There is an "I" in here')
Run Code Online (Sandbox Code Playgroud)

编辑:编辑包含集而不是列表和字符串

  • 这与集合有什么关系? (2认同)
  • 不,集合有一个额外的遏制检查条件,而序列则没有。 (2认同)

Mor*_*enB 5

集合的行为与字典不同,您需要使用诸如 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
Run Code Online (Sandbox Code Playgroud)