Как добавить ребро с атрибутами уже существующего ребра? - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь создать перевернутую копию ребер, если у них есть определенный атрибут, как показано ниже:

for i in list(G.edges(data=True, keys=True)):
    if i[3]['DIRECTIONA'] == 'bothDirections':
        G.add_edge(i[1],i[0],attr_dict=i[3])

Вышеупомянутое работает адекватно, но с одним неудобством, атрибуты имеют другой формат, а не простой словарь атрибутов этот словарь теперь находится внутри другого словаря под ключом attr_dict. Есть ли способ просто иметь словарь атрибутов, не находясь внутри другого? Это приводит к тому, что уже написанный код не работает, так как формат другой, спасибо.

1 Ответ

1 голос
/ 06 августа 2020

Вам необходимо указать атрибуты ребер как несколько аргументов ключевых слов (обычно представленных в сигнатурах функций как **kwargs):

import networkx as nx

g = nx.DiGraph()
g.add_edge(1,2, DIRECTIONA="oneway")
g.add_edge(1,3, DIRECTIONA="oneway")
g.add_edge(1,4, DIRECTIONA="bothDirections")
g.add_edge(2,3, DIRECTIONA="bothDirections")
g.add_edge(2,4, DIRECTIONA="oneway")


print(g.edges(data=True))
# [(1, 2, {'DIRECTIONA': 'oneway'}), (1, 3, {'DIRECTIONA': 'oneway'}), (1, 4, {'DIRECTIONA': 'bothDirections'}), (2, 3, {'DIRECTIONA': 'bothDirections'}), (2, 4, {'DIRECTIONA': 'oneway'})]

custom_reversed = nx.DiGraph()
for node_from, node_to, edge_data in list(g.edges(data=True)):  # networkx 2.4 doesn not have key parameter
    if edge_data['DIRECTIONA'] == 'bothDirections':
        custom_reversed.add_edge(node_from, node_to, **edge_data)


print(custom_reversed.edges(data=True))
[(4, 1, {'DIRECTIONA': 'bothDirections'}), (3, 2, {'DIRECTIONA': 'bothDirections'})]
...