Как добавить атрибут списка типов для каждого узла, при этом каждый узел имеет свою уникальную копию атрибута - PullRequest
0 голосов
/ 07 июня 2019

Мне нужно добавить атрибут к узлам на графике списка типов.

Каждый узел должен иметь свою собственную копию атрибута.

Мне нужно добавить этот атрибут после создания моего графа, потому что он не нужен, если функция, которая изменяет граф, никогда не вызывается.

Я пытался использовать функцию nx.set_node_attributes, но это дает каждому узлу атрибут, который я передаю функции по указателю.Таким образом, каждый узел указывает на один и тот же список, где то, что я хочу дать каждому узлу, является собственной копией (глубокой копией) списка.

import networkx as nx
G=nx.Graph()
G.add_node(1, attributelist = [])
G.add_node(2, attributelist = [ 'a', 'b', 6])
G.nodes(data=True)

nx.set_node_attributes(G,[],'TestList')
G.nodes[1]['TestList'].append('Value')

Я ожидаю, что вывод приведенного выше кода будетследует:

NodeDataView({1: {'attributelist': [], 'TestList': ['Value']}, 2: {'attributelist': ['a', 'b', 6], 'TestList': []}})

Но я получаю следующее:

NodeDataView({1: {'attributelist': [], 'TestList': ['Value']}, 2: {'attributelist': ['a', 'b', 6], 'TestList': ['Value']}})

Я вполне уверен, что это потому, что nx.set_node_attributes только что дал каждому узлу указатель на атрибут с именем TestList где, поскольку мне нужно, чтобы каждый узел имел свою собственную копию TestList.

Вы можете видеть, что узлы выше имеют еще один атрибут с именем attributelist.Этот атрибут ведет себя так, как я хочу.

Таким образом, добавление функции к attributelist добавляет только добавленное значение к указанному узлу.

G.nodes[1]['attributelist'].append('Cat')
G.nodes(data=True)

NodeDataView({1: {'attributelist': ['Cat'], 'TestList': ['Value']}, 2:{'attributelist': ['a', 'b', 6], 'TestList': ['Value']}})

1 Ответ

1 голос
/ 07 июня 2019

Передавая единый список (значение) для всех узлов, каждый узел получает ссылку на тот же список.

Вместо этого вы можете передать в словаре значение set_node_attributes вместо одного списка:

nx.set_node_attributes(G,{1: [], 2: []},'TestList')

Или, в более общем случае:

nx.set_node_attributes(G,{ n: [] for n in G.nodes() },'TestList')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...