使用Python networkx探索网络属性

3 投票
2 回答
803 浏览
提问于 2025-04-17 06:55

我正在尝试写一段代码,用来获取Twitter网络的一些特性。

但是我的代码出现了错误。我不知道为什么会这样。

错误信息是:

Traceback (most recent call last):
  File "Network_property.py", line 14, in <module>
    followee = line.strip().split('\t')[1]
IndexError: list index out of range

我的代码是:

import os, sys
import time
import networkx as nx


DG = nx.DiGraph()

ptime = time.time()
j = 1

#for line in open("./US_Health_Links.txt", 'r'):
for line in open("./test_network.txt", 'r'):
    follower = line.strip().split('\t')[0]
    followee = line.strip().split('\t')[1]

    DG.add_edge(follower, followee)

    if j%1000000 == 0:
        print j*1.0/1000000, "million lines done", time.time() - ptime
        ptime = time.time()
    j += 1

print nx.number_connected_components(DG)

我收集了一些链接数据,像这样:

1000    1001
1000    1020191
1000    10267352
1000    10957902
1000    11039092
1000    1118691
1000    11882
1000    1228281
1000    1247041
1000    12965332
1000    13027572
1000    13075072
1000    13183162
1000    13250162
1000    13326292
1000    13452672
1000    13844892
1000    14061830
1000    1406481
1000    14134703
1000    14216951
1000    14254402
1000    14258044
1000    14270791
1000    14278978
1000    14313332
1000    14392970
1000    14441172
1000    14497568
1000    14502775
1000    14595635
1000    14620544
1000    14632615
1000    14680596
1000    14956164
1000    14998341
1000    15132211
1000    15145450
1000    15285998
1000    15288974
1000    15300187
1000    1532061
1000    15326300

这里的“1000”是一个粉丝,其他的都是被关注的人。

+

我想得到以下几个结果:(1) 连接组件的数量,(2) 最大连接组件中节点的比例,(3) 入度的平均值和中位数,(4) 出度的平均值和中位数,(5) 网络的直径,以及 (6) 聚类系数。

但是网站“networkx.lanl.gov”无法使用。

有没有人能帮我一下?

2 个回答

1

你提供的 network.txt 文件示例里没有制表符(tab),而是用空格分开的。如果你把 split('\t') 改成 split(),那么它就会根据任何空白字符来分割,这样无论你的文件是用空格还是制表符分开的都能处理了。

1

这个错误和networkx没有直接关系。发生的情况是,有些行通过 line.strip().split('\t') 只返回了一个字段。我猜问题可能出在你的文件中有空行。对比一下:

>>> ''.split("\t")
['']
>>> ''.split("\t")[1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>>

所以,一个空行可能会导致这个问题。你可以明确检查一下,比如在你的 for 循环开始前加上

if not line:
    continue

来进行检查。

另外,可以看看 networkx.read_edgelist,如果你不需要 print 语句来显示进度,这个方法应该是最简单的。

撰写回答