This question already has answers here:
How/why does set() in {frozenset()} work?

(2个答案)


2年前关闭。




我想了解可以在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中的一组成员资格测试?

最佳答案

您无法测试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'

设置了唯一可用于包含检查的不可哈希对象。如documentation -中所给



为了支持搜索与集合具有相同元素的卡住集合,将集合暂时突变为frozenset()并进行比较。例子 -
>>> set([1,2]) in {1,2,frozenset([1,2])}
True

关于python - 是什么使元素有资格使用Python进行设置的成员资格测试?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32232182/

10-12 16:54