是什么使元素有资格通过Python进行设置的成员资格测试?[重复]

发布于 2021-01-29 15:57:57

这个问题已经在这里有了答案

{frozenset()}中的set()如何/为什么起作用? (2个答案)

2年前关闭。

我想了解哪些项目可以测试setPython的成员资格。通常,集合成员资格测试的工作方式类似于listPython中的成员资格测试。

>>> 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中的一组成员资格测试?

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您无法测试中的非哈希元素的成员资格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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看