2016-02-29 93 views
1

我试图读取由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)。我做错了什么?我注意到,如果我尝试附加行列表(例如dic[key].append(linelist)),代码工作正常,但我不会让我的变量从字符串转换为浮动。

有什么办法可以让它与xyz(float)列表一起工作吗?由于

+0

我不认为这是有关您当前的问题,而是'你的双分裂line'变成'linelist'似乎有点傻。为什么不使用'linelist = line.split()'并完成它?额外的'join'和'split'完全相反。 – Blckknght

+0

你没有从你以前的问题得到足够的:http://stackoverflow.com/questions/35679036/how-to-read-and-organize-text-files-divided-by-keywords。您可以将'linelist'更改为'list(map(float,linelist))'将它们全部转换为浮点。 – AChampion

+0

它们全部为空的原因是因为你重复使用了相同的'xyz'列表并删除了它的内容'del xyz [:]'。只需在'else'块中创建一个新的'xyz = []''。 – AChampion

回答

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

+0

是的,这是问题所在。谢谢! –

0

它看起来像你大大过度复杂这一点。你的代码非常难以遵循,部分原因是因为变量名称很模糊(什么是xyz?)。 @Blckknght正确地确定了程序中的错误原因。 (事实上​​,我给他/她一个给予好评)。我可以在这里做出贡献的唯一事情是一些工作代码:

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:])) 
+0

我想我可以使用更好的变量名称。额外的(分裂和加入)在那里,因为在原始文本文件中,我也有逗号和重复空格,我想摆脱它们。我几乎可以确定有更好的方法,但我只是从Python开始。谢谢你的评论! –