我在做一些编码练习,结果使用了set
个frozenset
。
代码如下:
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'
所以,我的问题是:为什么它与集合一起工作,而集合(据我所知)既不可散列,也不与列表一起工作? 如果它不也抛出一个错误,我错过了什么
无所谓,在documentation中找到了答案,任何人都想知道:
注意,
__contains__()
、remove()
和discard()
方法的elem参数可能是一个集合。为了支持搜索等效冻结集,将从elem创建一个临时冻结集从我对CPython源代码的读取来看,
contains
的测试似乎检查是否在集合中找到了密钥;如果不是,并且密钥是set
对象,则尝试将密钥转换为frozenset
,然后测试该密钥。类似remove
的操作也存在相同的行为,如下所示:解释器中讨论的代码是
Objects/setobject.c
中的set_contains()
函数相关问题 更多 >
编程相关推荐