【问题标题】:Object is not subscripable networkx对象不可订阅 networkx
【发布时间】:2018-04-29 18:08:30
【问题描述】:
import itertools
import copy
import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt
#--
edgelist = pd.read_csv('https://gist.githubusercontent.com/brooksandrew    /e570c38bcc72a8d102422f2af836513b/raw/89c76b2563dbc0e88384719a35cba0dfc04cd522/edgelist_sleeping_giant.csv')
edgelist.head(10)
#--
nodelist = pd.read_csv('https://gist.githubusercontent.com/brooksandrew/f989e10af17fb4c85b11409fea47895b/raw/a3a8da0fa5b094f1ca9d82e1642b384889ae16e8/nodelist_sleeping_giant.csv')
nodelist.head(5)
#--
g = nx.Graph()
#--
for i, elrow in edgelist.iterrows():
g.add_edge(elrow[0], elrow[1], attr_dict=elrow[2:].to_dict())
#--
#print(elrow[0])
#print(elrow[1])
#print(elrow[2:].to_dict())
#--
g.edges(data=True)[0:5]
g.nodes(data=True)[0:10]
#--
print(format(g.number_of_edges()))
print(format(g.number_of_nodes()))

得到以下错误:

Traceback (most recent call last):
  File "C:/Users/####/Main.py", line 22, in <module>
    g.edges(data=True)[0:5]
TypeError: 'EdgeDataView' object is not subscriptable

除了nada,我还阅读了其他几篇文章。 根据我的简单理解,错误是由[0:5] 引起的,但我很可能是错误的。

我是一个相当基本的编码员,我正在尝试关注this tutorial,但我收到了上面的错误。

【问题讨论】:

  • 这里g.edges的类型是什么?这很可能是不可下标的,因为它是一个字典或其他东西,发布来自print(type(g.edges(data=True))) 的输出,错误实际上表明它是一个EdgeDataView 对象,无论它是什么
  • 不是重复的——这是networkx v2.0的数据类型与v1.1不同的问题,所以这个错误的原因是变化。查看migration guide 了解如何将 v1.x 代码更新到 v2.0

标签: python python-3.x networkx


【解决方案1】:

本教程基于networkx 的先前版本,其中g.edges()g.edges(Data=True) 将为您提供元组列表。列表是可下标的。

您正在运行的版本具有不同的输出,g.edges 为您提供 EdgeView 属性,g.edges(data=True) 为您提供不可下标的 EdgeDataView 对象。要回答您的问题,您可以这样做:

list(g.edges(data=True))[0:5]

注意:g.nodes() 也是如此:之前它是 list,现在它是 NodeView 不可下标的属性。因此,在尝试添加下标 ([x:x]) 之前,不要忘记将其转换为 list 对象。

【讨论】:

  • 值得链接到migration guide 以获取问题是由从 1.x 更改为 2.0 引起的任何答案
猜你喜欢
  • 2022-12-11
  • 2020-09-07
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 2023-02-03
  • 2022-01-23
相关资源
最近更新 更多