【问题标题】:Networkx MultiDiGraph inheritance: add_weighed_edges_from KeyError: NoneNetworkx MultiDiGraph 继承:add_weighed_edges_from KeyError:无
【发布时间】:2021-11-06 17:56:15
【问题描述】:

我尝试使用 MultiDiGraph 制作 PERT 图。因此,我尝试放置一个布尔变量“_dirty”来检查图形是否变形。但是,add_weighted_edges_from 函数不能正常工作。代码错了吗?任何帮助将不胜感激。

class ClassName(nx.MultiDiGraph):
    # some code..

    def add_edge(self, *args, **kwargs):
        """ add one edge """
        self._dirty = True
        super().add_edge(*args, **kwargs)
        
    def add_edges_from(self, *args, **kwargs):
        """ add several edges """
        self._dirty = True
        super().add_edges_from(*args, **kwargs)  

    def add_weighted_edges_from(self, *args, **kwargs):
        """ add several weighted edges """
        self._dirty = True
        super().add_weighted_edges_from(*args, **kwargs)
g = ClassName()
g.add_weighted_edges_from([(1,2,5),(2,3,10)])

我得到的错误:

KeyError                                  Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_15100/3885668308.py in <module>  
----> 1 g.add_weighted_edges_from([(1,2,5),(2,3,10)])    

~\AppData\Local\Temp/ipykernel_15100/2908507458.py in add_weighted_edges_from(self, *args, **kwargs)
     32         """  add several weighted edges """
     33         self._dirty = True
---> 34         super().add_weighted_edges_from(*args, **kwargs)
     35 
     36     def remove_node(self, *args, **kwargs):    

~\anaconda3\envs\pytorch_env\lib\site-packages\networkx\classes\graph.py in add_weighted_edges_from(self, ebunch_to_add, weight, **attr)  
    986         >>> G.add_weighted_edges_from([(0, 1, 3.0), (1, 2, 7.5)])
    987           
--> 988         self.add_edges_from(((u, v, {weight: d}) for u, v, d in ebunch_to_add), **attr)  
    989   
    990     def remove_edge(self, u, v):    

~\AppData\Local\Temp/ipykernel_15100/2908507458.py in add_edges_from(self, *args, **kwargs)  
     27         """ add several edges """  
     28         self._dirty = True  
---> 29         super().add_edges_from(*args, **kwargs)  
     30  
     31     def add_weighted_edges_from(self, *args, **kwargs):    

~\anaconda3\envs\pytorch_env\lib\site-packages\networkx\classes\multigraph.py in add_edges_from(self, ebunch_to_add, **attr)  
    571                 key = dd  # ne == 3 with 3rd value not dict, must be a key  
    572             key = self.add_edge(u, v, key)  
--> 573             self[u][v][key].update(ddd)  
    574             keylist.append(key)  
    575         return keylist    

~\anaconda3\envs\pytorch_env\lib\site-packages\networkx\classes\coreviews.py in __getitem__(self, key)  
     52  
     53     def __getitem__(self, key):  
---> 54         return self._atlas[key]  
     55  
     56     def copy(self):    

KeyError: None

【问题讨论】:

  • 目前,该错误不可重现。我们不知道main_route_list 的输出是什么。你能创建一个minimal, reproducible example 吗? add_weighted_edges_from 一般适用于 MultiDiGraph。您也错过了weight 参数,格式不理想。
  • 我编辑了!我认为这是因为没有关键价值。但是,我想知道为什么尽管存在 **kwargs ,但不会自动生成键值。
  • 我仍然无法重现您的错误。请添加一个完整的例子,解释见上面的链接。
  • 我改变了例子。希望能理解!

标签: python networkx keyerror


【解决方案1】:

您错过了add_edgeMulti(Di)Graph 中返回key。添加return 可以解决您的问题:

class RailwayGraph(nx.MultiDiGraph):
    # some code..

    def add_edge(self, *args, **kwargs):
        """ add one edge """
        self._dirty = True
        return super().add_edge(*args, **kwargs)

    def add_edges_from(self, *args, **kwargs):
        """ add several edges """
        self._dirty = True
        super().add_edges_from(*args, **kwargs)

    def add_weighted_edges_from(self, *args, **kwargs):
        """ add several weighted edges """
        self._dirty = True
        super().add_weighted_edges_from(*args, **kwargs)


rg = RailwayGraph()
rg.add_weighted_edges_from([(1, 2, 5), (2, 3, 10)])

【讨论】:

  • 天啊,非常感谢!你是上帝
猜你喜欢
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2015-08-26
  • 2023-03-12
  • 1970-01-01
  • 2021-01-23
  • 2020-05-20
  • 1970-01-01
相关资源
最近更新 更多