如何将类型列表的属性添加到每个节点,每个节点都有其自己的属性的唯一副本

时间:2019-06-07 17:13:34

标签: python-3.x networkx

我需要在类型列表图的节点上添加一个属性。

每个节点都需要拥有自己的属性副本。

我需要在创建图形之后添加此属性,因为如果从未调用过更改图形的函数,则不需要此属性。

我尝试使用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

1 个答案:

答案 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')