【发布时间】:2015-11-20 19:42:16
【问题描述】:
我想了解哪些项目可以在 Python 中测试 set 成员资格。一般来说,集合成员资格测试的工作方式类似于 Python 中的list 成员资格测试。
>>> 1 in {1,2,3}
True
>>> 0 in {1,2,3}
False
>>>
但是,集合与列表的不同之处在于它们不能包含不可散列的对象,例如嵌套集合。
列表,好的:
>>> [1,2,{1,2}]
[1, 2, {1, 2}]
>>>
设置,因为不可散列而不起作用:
>>> {1,2,{1,2}}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>>
现在,即使集合不能是其他集合的成员,我们也可以在成员资格测试中使用它们。这样的检查不会导致错误。
>>> {1} in {1,2,3}
False
>>> {1,2} in {1,2,3}
False
>>> set() in {1,2,3}
False
>>>
但是,如果我尝试在要测试的元素是 dict 的情况下进行相同的测试,我会收到一个错误,表明要测试的元素不能是不可散列的。
>>> {'a':1} in {1,2}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> {} in {1,2}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>>
这不可能是全部,因为 set 可以测试它是否属于另一个集合,即使它本身是不可散列的,给出结果而不是错误。
所以问题是:是什么让一个元素有资格在 Python 中进行集合成员资格测试?
【问题讨论】:
-
呃,frozensets also 不能保存不可散列的项目 - 不同之处在于它们本身是可散列的
-
感谢您指出这一点。它应该是指frozenset 是一个集合的可能成员,但我的文字没有反映这一点。编辑了相关评论。
标签: python collections set