我需要在类型列表图的节点上添加一个属性。
每个节点都需要拥有自己的属性副本。
我需要在创建图形之后添加此属性,因为如果从未调用过更改图形的函数,则不需要此属性。
我尝试使用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
的属性的指针,其中我所需要的是每个节点都拥有自己的{{ 1}}。
您可以看到上面的节点还有另一个名为TestList
的属性。该属性的行为符合我的期望。
因此对attributelist
执行附加功能只会将附加值添加到指定的节点。
attributelist
答案 0 :(得分:1)
通过为所有节点传递单个列表(值),每个节点都获得对同一列表的引用。
相反,您可以将字典而不是单个列表传递给set_node_attributes
:
nx.set_node_attributes(G,{1: [], 2: []},'TestList')
或更笼统地说:
nx.set_node_attributes(G,{ n: [] for n in G.nodes() },'TestList')