Python Dictionary Comprehension访问不存在的密钥

时间:2014-09-02 20:51:07

标签: python dictionary dictionary-comprehension

我正在尝试创建一个如果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)}

谢谢大家!

3 个答案:

答案 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)不能直接用于理解。