Вы можете сделать это в два этапа, без необходимости повторения.
- Шаг 1: Рассчитайте кратчайшее расстояние от вашего «затратного» узла до всех достижимых узлов.
- Шаг 2: Подмножество (используя регулярное выражение) только интересующих вас узлов валюты.
Вот пример для иллюстрации.
import networkx as nx
import matplotlib.pyplot as plt
import re
g = nx.DiGraph()
#create a dummy graph for illustration
g.add_edges_from([('cost','apples'),('cost', 'of'),
('$2', 'pears'),('lemon', '£1.414'),
('apples', '$2'),('lemon', '£1.414'),
('€3.5', 'lemon'),('pears', '€3.5'),
], distance=0.5) # using a list of edge tuples & specifying distance
g.add_edges_from([('€3.5', 'lemon'),('of', '€3.5')],
distance=0.7)
nx.draw(g, with_labels=True)
, который производит:
Теперь вы можете рассчитать кратчайшие пути к интересующим вас узлам, поднабора, используя регулярное выражение, как вы хотели.
paths = nx.single_source_dijkstra_path(g, 'cost')
lengths=nx.single_source_dijkstra_path_length(g,'cost', weight='distance')
currency_nodes = [ n for n in lengths.keys() if re.findall('(\$|€|£)',n)]
[(n,len) for (n,len) in lengths.items() if n in currency_nodes]
производит:
[('$2', 1.0), ('€3.5', 1.2), ('£1.414', 2.4)]
Надежда, которая поможет вам двигаться вперед.