TypeError:'NodeView'对象不支持项目分配 - NetworkX

jch*_*kow 4 python networkx

我正在学习本教程:https://www.datacamp.com/community/tutorials/networkx-python-graph-tutorial

import itertools
import copy
import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt    
nodelist = pd.read_csv('https://gist.githubusercontent.com/brooksandrew/f989e10af17fb4c85b11409fea47895b/raw/a3a8da0fa5b094f1ca9d82e1642b384889ae16e8/nodelist_sleeping_giant.csv')

g = nx.Graph()

for i, nlrow in nodelist.iterrows():
    g.node[nlrow['id']] = nlrow[1:].to_dict()

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-80-35b1a259a02d> in <module>()
      1 for i, nlrow in nodelist.iterrows():
----> 2     g.node[nlrow['id']] = nlrow[1:].to_dict()

TypeError: 'NodeView' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)

运行它的结果应如下所示:

[('rs_end_south', {'X': 1865, 'Y': 1598}),
 ('w_gy2', {'X': 2000, 'Y': 954}),
 ('rd_end_south_dupe', {'X': 273, 'Y': 1869}),
 ('w_gy1', {'X': 1184, 'Y': 1445}),
 ('g_rt', {'X': 908, 'Y': 1378}),
 ('v_rd', {'X': 258, 'Y': 1684}),
 ('g_rs', {'X': 1676, 'Y': 775}),
 ('rc_end_north', {'X': 867, 'Y': 618}),
 ('v_end_east', {'X': 2131, 'Y': 921}),
 ('rh_end_south', {'X': 721, 'Y': 1925})]
Run Code Online (Sandbox Code Playgroud)

但我无法让python输出id后跟dict.

Mur*_*mel 11

代替:

g.node[nlrow['id']] = nlrow[1:].to_dict()
Run Code Online (Sandbox Code Playgroud)

使用:

g.node[nlrow['id']].update(nlrow[1:].to_dict())
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为g.node[x]只不过是一个字典.然而,我不确定为什么文档提出了另一种方式.

注意:

乔尔在评论中提出了一个很好的观点,我认为这非常重要:

注意 - 您使用的是networkx 2.0版,对吧?这是最近的,所以我怀疑这是与使用1.11版本编写它的人不兼容.我认为networkx提供了一些方法来完成这些命令试图做的事情,而无需直接编辑图形的底层数据结构.

因此,我的解决方案基本上是通过了解底层数据结构而不使用公共API来实现的,这不是一种好的编程风格.