我正在学习Python并且为了练习目的我正在编写一个脚本来读取文件(包含Trivial Graph Format中的图形)并在图形上运行几个图形算法。
我想过将图形存储在n个字典列表中,其中n是顶点数,顶点的所有边都存储在字典中。
我试过这个
edges = [{} for i in xrange(num_vertexes)]
for line in file:
args = line.split(' ')
vertex1 = int(args[0])
vertex2 = int(args[1])
label = int(args[2])
edges[vertex1][vertex2] = label
但是我在最后一行收到了这个错误:
IndexError:列表索引超出范围
答案 0 :(得分:4)
看起来vertex1
可能大于num_vertexes
。假设从0开始的python索引和格式的wiki上的示例从1开始,最后一行的顶点数可能比索引的长度高1(我当然需要查看文件才能确定) )。所以在python中,lst[0]
是第一个元素,lst[n-1]
是最后一个元素,其中顶点1
是第一个元素,n
是最后一个元素。 / p>
所以这里的解决方法是使用vertex1 = int(args[0])-1
答案 1 :(得分:2)
问题出在您的数据的某处,添加一些验证以确保您的代码不会阻塞不良数据。目前,如果某行包含非数字,少于三个数字或vertex1 >= len(edges)
,则您的代码将失败。
edges = [{} for i in xrange(num_vertexs)]
for line in file:
args = line.split(' ')
if len(args) >= 3:
try:
vertex1 = int(args[0])
vertex2 = int(args[1])
label = int(args[2])
if vertex1 < len(edges):
edges[vertex1][vertex2] = label
else:
# value for vertex1 is too large
pass
except ValueError:
# you got some non-number data
pass
else:
# you got a line with not enough data
pass
如果需要,可以使用日志记录替换任何pass
语句(如果您不打算使用它们,也可以删除两个else
块。)