我试图读取由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(浮点)列表一起使用?感谢
答案 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:]))