集合集合与“in”运算符

2024-05-14 10:54:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一些编码练习,结果使用了setfrozenset。 代码如下:

cities = 4
roads = [[0, 1], [1, 2], [2, 0]]
roads = set([frozenset(road) for road in roads])
    
output = []
    
for i in range(cities-1):
    for j in range(i+1, cities):
        if set([i,j]) not in roads:
            output.append([i,j])

如您所见,嵌套的for中的if测试集合集合中是否存在集合。 然而,我的理解是,在这种情况下,哈希表需要与in操作符一起使用

如果将set([i,j])替换为[i,j],则会出现以下错误:

TypeError: unhashable type: 'list'

所以,我的问题是:为什么它与集合一起工作,而集合(据我所知)既不可散列,也不与列表一起工作? 如果它不也抛出一个错误,我错过了什么


Tags: 代码in编码foroutputif错误not
2条回答

无所谓,在documentation中找到了答案,任何人都想知道:

注意,__contains__()remove()discard()方法的elem参数可能是一个集合。为了支持搜索等效冻结集,将从elem创建一个临时冻结集

从我对CPython源代码的读取来看,contains的测试似乎检查是否在集合中找到了密钥;如果不是,并且密钥是set对象,则尝试将密钥转换为frozenset,然后测试该密钥。类似remove的操作也存在相同的行为,如下所示:

>>> s = set([frozenset([1,2])])
>>> s
{frozenset({1, 2})}
>>> s.remove(set([1,2]))
>>> s
set()

解释器中讨论的代码是Objects/setobject.c中的set_contains()函数

相关问题 更多 >

    热门问题