我正在尝试创建一个如果n == 3
{
0: [1, 2],
1: [0, 2],
2: [0, 1]
}
基本上......只是一个带有键的字典,它映射到包含除映射到的那个之外的其他键整数的数组。我的代码:
import itertools
graph = {i: range(num_nodes) for i in range(num_nodes)}
for i in graph.keys():
graph[i].remove(i)
我不确定为什么会抛出此错误ValueError: list.remove(x): x not in list
经过一番研究,发现我可以在两组之间进行减法,并一次完成所有操作:
graph = {i: list(set(range(num_nodes)) - set([i])) for i in range(num_nodes)}
谢谢大家!
答案 0 :(得分:2)
这是因为type(graph[i])
不是list
,而是range
类型。将其转换为列表并尝试:
[编辑:删除减法,检查sgarza62' s comment]
import itertools
graph = {i: list(range(num_nodes)) for i in range(num_nodes)}
for i in graph.keys():
graph[i].remove(i)
答案 1 :(得分:1)
在编辑之前,这是一个错误的错误。
import itertools
num_nodes = 3
graph = {i: range(num_nodes) for i in range(num_nodes)}
for i in graph.keys():
graph[i].remove(i)
print graph
# {0: [1, 2], 1: [0, 2], 2: [0, 1]}
答案 2 :(得分:1)
如果你想在没有额外的for循环的情况下使用dict理解,试试这个:
import itertools
num_nodes = 3
graph = {i: (range(num_nodes)[:i] + range(num_nodes)[i+1:]) for i in range(num_nodes)}
注意:遗憾的是,列表连接是必要的,因为list.remove(x)
不会返回更新的列表,但会更改列表并且不返回任何内容。因此,range(num_nodes).remove(i-1)
不能直接用于理解。