所以我试图使用一个集来跟踪包含元组和元组列表的元组。以下是错误之前集合中的内容示例:
((1, 16), [(1, 1), (1, 13), (1, 14), (1, 15), (1, 18), (2, 1), (2, 4), (2, 7), (2, 10), (2, 13), (2, 18), (3, 6), (3, 7), (3, 8), (3, 9), (3, 10), (3, 18)])
这是我得到的错误:
Traceback (most recent call last):
File "src/graph.py", line 60, in <module>
end_node, A_expanded = A_search_multiple(maze,start,dot_locs)
File "/home/lstrait2/cs440/mp1/src/search_multiple.py", line 37, in A_search_multiple
if((loc,state) not in closed):
TypeError: unhashable type: 'list'
[lstrait2@linux-a2 mp1]$ gedit src/search_multiple.py
我能做些什么来使这项工作?基本上我正在使用该集来确保表格的元组(位置,位置列表)没有出现两次。
答案 0 :(得分:2)
简短回答:
您必须将列表转换为元组。拥有一个元组元组(嵌套元组)是合法的。
为什么会这样?
集和词典的工作原理是唯一性。在将值添加到它们时,它们确定它们是否已包含相同性质的值。这是容器唯一有机会强制执行其独特元素的不变量。列表当然可以比较平等,但问题是它们可以改变。让我们假装您可以将列表添加到集合中。请考虑以下示例:
list1 = [42]
list2 = [42, 13]
list1 == list2 # this would show false, they're different lists, obviously
mySet = set()
mySet.add(list1) # python won't allow this, but we're pretending it would
mySet.add(list2) # ditto
如果我们此时打印mySet
,我们希望会有类似的内容:
{[42, 13], [42]}
但我们可以更改列表,那么如果我们现在执行了该怎么办:
list1.append(13)
list1 == list2 # This used to be false, but now it is true
不知道包含集合,在它的意识之外,它的两个元素突然变得相等。现在我们已经违反了一个集合的元素应该是唯一的不变量。
为了避免这个问题,dict
和set
将不允许您在其中粘贴知道易于更改的对象。