生成器的KeyError

时间:2015-03-05 14:59:20

标签: python generator networkx

如此接近,但到目前为止。

我不确定发生了什么,但是为我工作的生成器脚本突然开始抛出KeyErrors。我根据我给每个节点的类别为networkx节点分配属性。

每个节点都是这样......

539943797.0: {'category': 'perimeter'}

我用这样的变量定义尺寸......

node_sizes = {'core':500, 'perimeter':50}

并且实际节点绘制代码如下所示,生成器就位......

nx.draw_networkx_nodes(G, graph_pos, 
                       node_size=[node_sizes[G.node[node]['category']]for node in G],
                       alpha=node_alpha,  
                       node_color=[node_colors[G.node[node]['category']]for node in G])

问题是,上面的生成器代码(不久前工作)在运行时给了我一个KeyError:'category'错误。

然而,这称呼......

node_sizes[G.node[539943797.0]['category']]
正如我所料,

让我获得50的价值;将类别从539943797.0拉为“周长”,其大小为50.到目前为止一切顺利。我不确定我在这里做错了什么。我希望另外几套眼睛可以给我一个更好的主意。

我怀疑我在调用类别或设置类别方面做错了什么

(我在这里设置了......)

for node in graph[1]:
    G.add_node(node)
    G.node[node]['category'] = 'perimeter'

如果我需要提供更多的代码以便更好地理解,我会尝试修改并将其放在这里。希望我提供的足够。

感谢,

1 个答案:

答案 0 :(得分:0)

在评论中,您说这是在您开始添加边缘后开始发生的。我认为这就是问题所在。即使一个节点没有定义'category',您也会收到此错误。我认为添加边缘会导致添加一些没有定义category的节点。第一个测试是通过

for node in G.nodes():
    if not G.node[node].has_key('category'):
        print node

在您收到错误之前。 我打赌你会发现你的大多数节点都没问题,但有些节点还没有。

如果我有代码

import networkx as nx
G=nx.Graph()
G.add_node(1)
G.node[1]['category'] = 'perimeter'
for node in G.nodes():
    if not G.node[node].has_key('category'):
        print node

我没有输出。所有(1)个节点都定义了'category'。 但是,如果我再尝试

G.add_edge(1,2)

for node in G.nodes():
    if not G.node[node].has_key('category'):
        print node

输出

  

2

这是因为当我添加边缘时,networkx还看到了G中没有的节点。它假设您也想添加节点。现在您已经添加了一个新节点2,但它并不知道它应该定义'category'。所以它没有。

从你所描述的内容来看,这几乎肯定是正在发生的事情。要检查这一点,在添加任何边之前,您可以检查两个节点是否已在图中。或者,如果您的代码一次添加了大量边,只需检查G.order()之前和之后是否相同。一旦你弄清楚它为什么这样做,大概你可以决定你想用这些节点做什么。

如果这没有找到问题,那么您需要发布更多代码,以便我们能够重现您的错误。