生成器上的 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 更多代码,以便我们有一些东西可以重现您的错误。
那么近,又那么远。
我不确定发生了什么,但为我工作的生成器脚本突然开始抛出 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 更多代码,以便我们有一些东西可以重现您的错误。