Сосед терминального узла в Networkx

#python-3.x #graph #networkx

#python-3.x #График #networkx

Вопрос:

Я пытаюсь получить соседние узлы терминального узла в Networkx

 import networkx as nx

tail = [1,2,3]
head = [2,3,4]
ed_ls = [(t, h) for t, h in zip(tail, head)]
G = nx.OrderedDiGraph()
G.add_edges_from(ed_ls)

print(G[4])
print(G.in_edges(nbunch=[4]))
  

Я не уверен, почему возвращается пустой dict.

Есть предложения?

Ответ №1:

G[4] возвращает пустой словарь, поскольку исходящее ребро от узла отсутствует. Тогда как, G.in_edges(nbunch=[4]) возвращает (3, 4) , который является ребром, содержащим узел 4 .

Если я правильно понимаю, вы конкретно хотите получить доступ к соседям терминального узла? Теперь в этом случае соседи терминального узла являются просто предшественниками узла (поскольку у узла нет преемников), вы можете просто попробовать функцию Digraph.precediators:

 print(list(G.predecessors(4)))
# Output : [3]
  

Рассмотрим другой пример с большим количеством ребер:

 import networkx as nx

tail = [1, 2, 3, 4, 2, 3]
head = [2, 3, 4, 5, 5, 5]
ed_ls = [(t, h) for t, h in zip(tail, head)]
G = nx.OrderedDiGraph()
G.add_edges_from(ed_ls)

print(list(G.predecessors(5)))
# Output: [4, 2, 3]
  

Обновить

Причина, по которой even G.neighbors[4] return an empty возвращает пустой результат, заключается в том, что в случае орграфов DiGraph.neighbors и DiGraph.successors совпадают. Вы можете видеть из исходного кода здесь. Поскольку для терминального узла нет преемника, следовательно, мы получаем пустой список.

Комментарии:

1. Спасибо. Но мне непонятно, почему даже G.neighbors (4) не работает. В документации показано, что это работает для орграфа. Не могли бы вы пояснить, почему все они ищут только исходящее ребро?