Python 3.x Networkx添加节点似乎忽略了作为字典解析的属性
我正在将数据从社交平台API加载到networkx图形中,以进行一些分析。但是有问题。Python 3.x Networkx添加节点似乎忽略了作为字典解析的属性,python-3.x,networkx,Python 3.x,Networkx,我正在将数据从社交平台API加载到networkx图形中,以进行一些分析。但是有问题。add\u节点函数似乎正在输入I pass,因此没有添加任何属性 来自API的数据 以以下形式出现: data= {'users': [{'1': {'attrib1': 'some value', 'attrib2': 'some other value', .... etc}, '2
add\u节点
函数似乎正在输入I pass,因此没有添加任何属性
来自API的数据
以以下形式出现:
data= {'users': [{'1': {'attrib1': 'some value',
'attrib2': 'some other value',
.... etc},
'2': {'attrib1': 'some val',
'attrib2': 'you get the idea',
... etc},
... etc
}]}
那就是
dict with one key 'users'
list with one element [0]
a dict of each users with user number as the key
a dict that contains the same id and a load of other attributes
(结构有点奇怪……)
我已经成功地在nx.DiGraph
中创建了节点,其中包括:
G = nx.DiGraph()
for u in data['users'][0].values():
G.add_node(str(u['id']),attr_dict=u)
但是当我在G
(例如nx.get\u node\u attibutes(G,'firstName')
)中测试节点时,似乎没有任何附加到节点的属性
问题
u
绝对是一个dict,我已经检查过了数据
dict操作到不同的结构中好的,在绝望的时刻,我从
add\u节点
调用中删除了关键字参数attr\u dict
。e、 g
G = nx.DiGraph()
for u in data['users'][0].values():
G.add_node(str(u['id']),u)
成功了!我不知道为什么它不喜欢我显式地映射参数。有人知道为什么吗
我很好奇。我猜你在
attr\u dict
中输入了一个错误。在您第一次尝试时,它可能已经工作得很好了,您只是“对节点进行了测试”,并不是非常详尽,因此没有意识到您的打字错误是什么
不要使用nx.get_node\u attibutes(G,'firstName')
——即检查某个属性是否存在——您可以使用G.node
,它列出了图形中的所有节点及其属性
但让我们开门见山吧。关于add_node
的交易是,如果添加一个节点,可以将属性及其值作为关键字参数对传递。以add_节点
文档页面上的代码片段为例:
G.add_node(3,weight=0.4,UTM=('13S',382871,3972649))
在这里,我们向图中添加一个id为3
的节点,并为其指定一个weight
属性,该属性的值为0.4
,以及一个UTM
属性,该属性的值为元组。如果我们用G.node
检查它,我们会看到
>>> G.node
{3: {'weight': 0.4, 'UTM': ('13S', 382871, 3972649)}}
每个关键字都作为键添加到节点的属性dict中!
一切进展顺利。这与我们将属性作为attr\u dict
传递的结果完全相同:
>>> G.clear()
>>> G.add_node(3, attr_dict={'weight': 0.4, 'UTM': ('13S',382871,3972649)})
>>> G.node
{3: {'weight': 0.4, 'UTM': ('13S', 382871, 3972649)}}
在你的情况下,我怀疑你在“attr_dict”中打错了。在本例中,networkx认为不是指实际的attr\u dict
关键字,而是指属性名。下面是一个例子:
>>> G.clear()
>>> G.add_node(3, attr_dict_typo={'weight': 0.4, 'UTM': ('13S',382871,3972649)})
>>> G.node
{3: {'attr_dict_typo': {'weight': 0.4, 'UTM': ('13S', 382871, 3972649)}}}
因此,当您试图检查属性'firstname'
是否与nx.get_node\u attibutes(G,'firstname')
一起存在时,函数查找了一个名为'firstname'
的键,但只找到了'attr\u dict\u typo'
,并返回了None
如果您有任何问题,请告诉我。自networkx
起,attr\u dict
参数在.add\u edge()
和add\u edges\u from()方法中不再允许。也许这也被传播到了add_node()
也许您可以尝试使用以下命令添加它们:G.add\u节点(1,**attr\u dict)
另请参见GitHub中的相关问题: