如何访问通过 networkx 最短路径函数生成的列表
how to have access to lists generated through networkx shortest path function
考虑下面的代码:
G2 = nx.DiGraph()
G2.add_edges_from([('A','B'),('A','C'),('F','G'),('A','F'),('F','H'),('A','I')])
nx.draw(G2, with_labels=1)
paths = (nx.all_pairs_shortest_path(G2))
for path in paths :
print(path)
这段代码的输出是:
('A', {'A': ['A'], 'B': ['A', 'B'], 'C': ['A', 'C'], 'F': ['A', 'F'], 'I': ['A', 'I'], 'G': ['A', 'F', 'G'], 'H': ['A', 'F', 'H']})
('B', {'B': ['B']})
('C', {'C': ['C']})
('F', {'F': ['F'], 'G': ['F', 'G'], 'H': ['F', 'H']})
('G', {'G': ['G']})
('H', {'H': ['H']})
('I', {'I': ['I']})
我想知道如何访问所有列表,例如 ['A']、['A'、'B']、['A'、'C'], ['A', 'F'] , ... 并将它们存储在列表中。
谢谢。
paths
是一个生成器。它不支持项目分配。您可能希望将其转换为执行此操作的数据结构:
d = dict(paths)
>>> print(d)
{'A': {'A': ['A'], 'B': ['A', 'B'], 'C': ['A', 'C'], 'F': ['A', 'F'], 'I': ['A', 'I'], 'G': ['A', 'F', 'G'], 'H': ['A', 'F', 'H']}, 'B': {'B': ['B']}, 'C': {'C': ['C']}, 'F': {'F': ['F'], 'G': ['F', 'G'], 'H': ['F', 'H']}, 'G': {'G': ['G']}, 'H': {'H': ['H']}, 'I': {'I': ['I']}}
这不是很有代表性。但是,您仍然可以检查特定的边缘,例如:
>>> d['A']['H']
['A', 'F', 'H']
我们还可以稍微整理一下,以获得所有可能的路径遍历:
from itertools import product
>>> print(list(product(d.keys(), repeat=2)))
[('A', 'A'), ('A', 'B'), ('A', 'C'), ..., ('I', 'G'), ('I', 'H'), ('I', 'I')]
dd = {(a, b): d[a][b] for a, b in product(d.keys(), repeat=2) if b in d[a]}
>>> dd
{('A', 'A'): ['A'],
('A', 'B'): ['A', 'B'],
('A', 'C'): ['A', 'C'],
('A', 'F'): ['A', 'F'],
('A', 'G'): ['A', 'F', 'G'],
('A', 'H'): ['A', 'F', 'H'],
('A', 'I'): ['A', 'I'],
('B', 'B'): ['B'],
('C', 'C'): ['C'],
('F', 'F'): ['F'],
('F', 'G'): ['F', 'G'],
('F', 'H'): ['F', 'H'],
('G', 'G'): ['G'],
('H', 'H'): ['H'],
('I', 'I'): ['I']}
它可以以不同的方式使用:
>>> dd['A', 'H']
['A', 'F', 'H']
或者,没有 itertools
:
dd = {(a, b): d[a][b] for a in d.keys() for b in d.keys() if b in d[a]}
输出应该是一样的。
考虑下面的代码:
G2 = nx.DiGraph()
G2.add_edges_from([('A','B'),('A','C'),('F','G'),('A','F'),('F','H'),('A','I')])
nx.draw(G2, with_labels=1)
paths = (nx.all_pairs_shortest_path(G2))
for path in paths :
print(path)
这段代码的输出是:
('A', {'A': ['A'], 'B': ['A', 'B'], 'C': ['A', 'C'], 'F': ['A', 'F'], 'I': ['A', 'I'], 'G': ['A', 'F', 'G'], 'H': ['A', 'F', 'H']})
('B', {'B': ['B']})
('C', {'C': ['C']})
('F', {'F': ['F'], 'G': ['F', 'G'], 'H': ['F', 'H']})
('G', {'G': ['G']})
('H', {'H': ['H']})
('I', {'I': ['I']})
我想知道如何访问所有列表,例如 ['A']、['A'、'B']、['A'、'C'], ['A', 'F'] , ... 并将它们存储在列表中。
谢谢。
paths
是一个生成器。它不支持项目分配。您可能希望将其转换为执行此操作的数据结构:
d = dict(paths)
>>> print(d)
{'A': {'A': ['A'], 'B': ['A', 'B'], 'C': ['A', 'C'], 'F': ['A', 'F'], 'I': ['A', 'I'], 'G': ['A', 'F', 'G'], 'H': ['A', 'F', 'H']}, 'B': {'B': ['B']}, 'C': {'C': ['C']}, 'F': {'F': ['F'], 'G': ['F', 'G'], 'H': ['F', 'H']}, 'G': {'G': ['G']}, 'H': {'H': ['H']}, 'I': {'I': ['I']}}
这不是很有代表性。但是,您仍然可以检查特定的边缘,例如:
>>> d['A']['H']
['A', 'F', 'H']
我们还可以稍微整理一下,以获得所有可能的路径遍历:
from itertools import product
>>> print(list(product(d.keys(), repeat=2)))
[('A', 'A'), ('A', 'B'), ('A', 'C'), ..., ('I', 'G'), ('I', 'H'), ('I', 'I')]
dd = {(a, b): d[a][b] for a, b in product(d.keys(), repeat=2) if b in d[a]}
>>> dd
{('A', 'A'): ['A'],
('A', 'B'): ['A', 'B'],
('A', 'C'): ['A', 'C'],
('A', 'F'): ['A', 'F'],
('A', 'G'): ['A', 'F', 'G'],
('A', 'H'): ['A', 'F', 'H'],
('A', 'I'): ['A', 'I'],
('B', 'B'): ['B'],
('C', 'C'): ['C'],
('F', 'F'): ['F'],
('F', 'G'): ['F', 'G'],
('F', 'H'): ['F', 'H'],
('G', 'G'): ['G'],
('H', 'H'): ['H'],
('I', 'I'): ['I']}
它可以以不同的方式使用:
>>> dd['A', 'H']
['A', 'F', 'H']
或者,没有 itertools
:
dd = {(a, b): d[a][b] for a in d.keys() for b in d.keys() if b in d[a]}
输出应该是一样的。