TypeError: unhashable type: 'list' in python

TypeError: unhashable type: 'list' in python

我是 python 的新手,我正在尝试执行以下操作:

  1. 从列表 randomnodes 中按顺序取出一个元素 x 并在列表末尾附加 neighbors of x
  2. 重复此操作,直到列表的大小为 100。

我写的代码如下:

for x in randomnodes:
    if len(randomnodes)<=100:
        randomnodes.append(neighbors(x))

其中 neighbors(x) returns 一个列表。

但是代码报错:

Traceback (most recent call last):
 File "randomsampling_diameter.py", line 48, in <module>
     randomnodes.append(neighbors(x))
 File "/usr/local/lib/python2.7/dist-packages/networkx-1.9.1-py2.7.egg/networkx/classes/graph.py", line 980, in neighbors
     return list(self.adj[n])
TypeError: unhashable type: 'list'

为什么会这样?应该如何修改代码来实现任务?

您遇到的问题是您将邻居列表添加到 randomnodes 的末尾,而不是从列表中添加元素。这导致稍后的迭代尝试获取嵌套邻居列表的邻居,从而导致异常。

如果您不介意 randomnodes 列表有时会获得一些额外的元素,您可以在当前代码中将 append 替换为 extend

否则,请尝试使用 list.extend 将邻居列表中适当数量的元素添加到 randomnodes 的稍微复杂一点的代码,而不要使其超过 100 个项目:

for x in randomnodes:
    neighbors_list = neighbors(x)
    if len(randomnodes) + len(neighbors_list) < 100:
        randomnodes.extend(neighbors_list)
    else:
        randomnodes.extend(neighbors_list[:100-len(randomnodes)]
        break

请注意,您的代码和我上面建议的代码都没有努力确保没有重复的结果添加到 randomnodes。如果您的图表可能有循环,您可能需要添加一些逻辑来避免这种情况。这不像对 randomnodes 使用 set 那样简单(因为在遍历集合时无法修改它),但您可以使用 set过滤每个邻居列表的可见节点数:

seen = set(randomnodes)
for x in randomnodes:
    neighbors_list = [n for n in neighbors(x) if n not in seen]
    if len(randomnodes) + len(neighbors_list) < 100:
        randomnodes.extend(neighbors_list)
        seen.update(neighbors_list)
    else:
        randomnodes.extend(neighbors_list[:100-len(randomnodes)]
        break