Как найти узлы с функциями сопоставления строк Python в Networkx? - PullRequest
0 голосов
/ 09 июня 2018

Учитывая график разбора зависимостей, если я хочу найти кратчайшую длину пути между двумя фиксированными узлами, вот как я ее кодировал:

nx.shortest_path_length (graph, source='cost', target='20.4')

Мой вопрос здесь: что если я хочусопоставить все предложения в графе или коллекции с целым числом, отформатированным приблизительно как валюта?Должен ли я сначала найти каждый узел на графике, который является валютой, а затем выполнить итерацию по набору значений валюты?

Было бы идеально иметь:

nx.shortest_path_length (graph, source='cost', target=r'^[$€£]?(\d+([\.,]00)?)$')

Или от @ bluepnume ^[$€£]?((([1-5],?)?\d{2,3}|[5-9])(\.\d{2})?)$

1 Ответ

0 голосов
/ 11 июня 2018

Вы можете сделать это в два этапа, без необходимости повторения.

  • Шаг 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)

, который производит:

enter image description here

Теперь вы можете рассчитать кратчайшие пути к интересующим вас узлам, поднабора, используя регулярное выражение, как вы хотели.

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)]

Надежда, которая поможет вам двигаться вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...