是什么使元素有资格通过Python进行设置的成员资格测试?[重复]
这个问题已经在这里有了答案 :
{frozenset()}中的set()如何/为什么起作用? (2个答案)
2年前关闭。
我想了解哪些项目可以测试set
Python的成员资格。通常,集合成员资格测试的工作方式类似于list
Python中的成员资格测试。
>>> 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'
>>>
那不可能是完整的故事,因为即使a本身不能散列,set
也 可以测试a在另一个集合中的成员资格,从而给出结果而不是错误。
所以问题是: 是什么使元素有资格使用Python中的一组成员资格测试?
-
您无法测试中的非哈希元素的成员资格
set
。范例->>> [1,2] in {1,2} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' >>> {1:2} in {1,2} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'dict'
注意, contains (),remove()和discard()方法 的elem参数 可以是set
。为了支持搜索等效的冻结集,在搜索过程中临时更改元素集,然后将其还原。在搜索过程中,不应读取或更改elem集,因为它没有有意义的值。为了支持搜索与集合具有相同元素的冻结集合,将集合暂时突变
frozenset()
并进行比较。范例->>> set([1,2]) in {1,2,frozenset([1,2])} True