如何创建一个包含n个字典的列表
我正在学习Python,为了练习,我写了一个脚本,用来读取一个文件(这个文件包含一个图,格式是简单图格式),然后在这个图上运行几个图算法。
我想把这个图存储在一个包含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: list index out of range
2 个回答
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
块,也可以把它们删掉)。
4
看起来 vertex1
可能大于 num_vertexes
。因为在 Python 中,索引是从 0 开始的,而维基百科上的例子是从 1 开始的,所以最后一行的顶点编号可能比索引的长度多 1(当然,我需要查看文件才能确认)。在 Python 的情况下,lst[0]
是第一个元素,而 lst[n-1]
是最后一个元素。在顶点的情况下,1
是第一个元素,n
是最后一个元素。
所以这里的解决办法是使用 vertex1 = int(args[0])-1