【发布时间】:2021-08-17 14:05:37
【问题描述】:
我创建了一个包装类Graph,在其中创建了基于networkx 的图表。然而,这个类的对象是不可迭代的。为了解决这个问题,我知道我必须为我的Graph 类定义__iter__() 函数,其中调用了一个迭代器类的实例,比如GraphIterator。我刚刚检查了各种__next__() 函数的一些示例,虽然我不知道我应该如何定义我的班级的__next__() 函数。任何帮助将不胜感激。
import networkx as nx
import matplotlib.pyplot as plt
class Graph():
def __init__(self, nodes=None, raw_edges=None, source_node=None, target_node=None):
G = nx.Graph(source_node=None, target_node=None)
G.add_nodes_from(nodes)
G.add_edges_from([self.create_edge(raw_edge) for raw_edge in raw_edges])
G.graph["source_node"] = self.assign_source_node(source_node, G.nodes)
G.graph["target_node"] = self.assign_target_node(target_node, G.nodes)
def __iter__(self):
return GraphIterator(self)
def create_edge(self, raw_edge):
return [raw_edge[0], raw_edge[1], {'attr': raw_edge[2]}]
def assign_source_node(self, source_node, node_list):
if (int(source_node) in node_list):
return source_node
else:
raise ValueError("Source node assignnmet is problematic!")
def assign_target_node(self, target_node, node_list):
if (int(target_node) in node_list):
return target_node
else:
raise ValueError("Target node assignnmet is problematic!")
class GraphIterator:
def __init__(self, graph):
self._graph = graph
self._index = 0
def __next__(self):
pass
def main():
nodes = [1,2,3]
raw_edges = [[1,2,1],[1,3,1],[2,3,1]]
source_node = "1"
target_node = "3"
graph = Graph(nodes, raw_edges, source_node, target_node)
nx.draw(graph, with_labels=True, font_weight="bold")
plt.show()
if __name__ == "__main__":
main()
【问题讨论】:
-
networkx Graph 不是已经provide an iterator?
-
@Mark:链接说它遍历节点(我想不是边)。同样,我不知道如何在我的上下文中使用它。
-
如果您需要遍历边缘,
for edge in G.edges可以。 -
另外,您可能应该阅读有关生成器的信息。手动编写迭代器很少是最好的选择。