将列表附加到字典

时间:2016-02-29 02:25:14

标签: python python-3.x dictionary text-files

我试图读取由kewords分隔的文本文件。我使用字典来组织与每个部分相对应的信息。例如,对于文本文件:

*VERTICES
1 0 0
2 10 0
3 10 10
4 0 10
*EDGES
1 1 2
2 1 4
3 2 3
4 3 4

包含*EDGES*VERTICES部分。我的目标是制作一个字典,如:

dict = {'*VERTICES': [[0,0], [0,10], [10,0], [10,10]], '*EDGES': [[1,2], [1,4], [2,3], [3,4]]}

这是我的代码:

with open('c:/geometry.txt','r') as inputfile:
    xyz = []
    dic = {}
    key = None
    for line in inputfile:
        line = line.replace(',','')
        linelist = ' '.join(line.split())
        linelist = linelist.split(' ')
        if(linelist[0][0]=='*'):
            key = linelist[0]
            dic[key] = []
        else:
            for i in range(0,len(linelist)):
                string2float = float(linelist[i])
                xyz.append(string2float)
            dic[key].append(xyz)
            del xyz[:]

print(dic)

这是当前的输出:

{'*VERTICES': [[], [], [], []], '*EDGES': [[], [], [], []]}

你可以看到Emtpy。我猜测错误在dic[key].append(xyz)行。我做错了什么?我注意到,如果我尝试添加linelist(例如dic[key].append(linelist)),代码工作正常,但我不会将我的变量从字符串转换为float。

有什么方法可以让它与xyz(浮点)列表一起使用?感谢

2 个答案:

答案 0 :(得分:1)

代码的最后几行没有按照您的要求执行操作:

        dic[key].append(xyz)
        del xyz[:]

您将xyz列表的引用添加到词典中的列表中,但是您要删除列表的内容。切片上的del语句会修改列表,因此存储在词典中的引用也会在之后看到空列表结果。

实际上,字典中的所有空内部列表都是对同一个空xyz列表的引用。您可能想要做的是实际为xyz创建一个新列表,而不是删除其内容:

        dic[key].append(xyz)
        xyz = []

或者,更好的是,使用列表推导来构建包含其内容的新列表并完全删除xyz变量:

    else:
        dic[key].append([float(num) for num in linelist])

请注意,这将包含内部词典中文件中的所有三个值。如果你只想要两个,你可能想要切片linelist

答案 1 :(得分:0)

看起来你大大过分复杂了。您的代码很难遵循,部分原因是隐含的变量名称(xyz是什么?)。 @Blckknght正确识别了程序中错误的原因。 (事实上​​,我给了他/她一个upvote。)我唯一可以贡献的是一些工作代码:

d = {}

with open('c:/geometry.txt','r') as f:
    for line in f:
        if line.startswith('*'):
            key = line.strip()
            d[key] = []
        else:
            d[key].append(map(int, line.split()[1:]))