如何创建一个包含n个字典的列表

3 投票
2 回答
1550 浏览
提问于 2025-04-17 07:30

我正在学习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

撰写回答