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

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

但是我在最后一行遇到了这个错误:

索引错误:列表索引超出范围


你能给一个数据格式的例子吗?以及会生成这个数据格式的文件中的行? - sberry
4
@DavidAlber这样做效果不太好,因为内部字典将被引用复制。例如tst = [{}]*5; tst[0][1]=1;tst会输出[{1: 1}, {1: 1}, {1: 1}, {1: 1}, {1: 1}]。你可以使用[{} for x in xrange(num_vertexs)]代替。 - David H. Clements
3
你可能会对Guido在实现图表方面的论文感兴趣。 - jan zegan
大家请看dclements的回答。问题原来是我在代码中犯了一个非常愚蠢的错误。我忽视了TGF数据格式中第一个顶点从1开始而不是0的事实。因此出现了错误。对于打扰你们,我感到很抱歉! - sudokai
@jan zegan:感谢提供链接! - sudokai
2个回答

4
看起来vertex1可能大于num_vertexes。由于Python从0开始索引,而维基上的示例从1开始,最后一行的顶点号码可能比索引的长度高1(当然,我需要查看文件才能确定)。因此,在Python中,lst[0]是第一个元素,lst[n-1]是最后一个元素,其中顶点1是第一个元素,而n是最后一个元素。

因此,解决方法是使用 vertex1 = int(args[0])-1


我真是太傻了!我怎么会忽略这个呢?使用vertex1 = int(args[0])-1解决了问题。非常感谢 :) - sudokai

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 块)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接