生成器上的 KeyError

KeyError on Generator

那么近,又那么远。

我不确定发生了什么,但为我工作的生成器脚本突然开始抛出 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 中提取类别 'perimeter',其大小为 50。到目前为止一切顺利。我不确定我在这里做错了什么。我希望另外几双眼睛能给我一个更好的主意。

我怀疑我调用或设置类别的方式有误

(我这里设置的...)

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

如果我需要提供更多代码以便更好地理解,我会尝试 trim 并将其放在此处。希望我已经提供了足够的。

谢谢,

在您的评论中,您说这种情况是在您开始添加边之后开始发生的。我认为这就是问题所在。如果甚至一个节点都没有定义 '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() 前后是否相同。一旦你弄清楚它为什么这样做,大概你就可以决定你想用这些节点做什么。

如果这没有发现问题,那么您将需要 post 更多代码,以便我们有一些东西可以重现您的错误。