我有一个类似于下面的文件:
t_air_sens1
laten
t_air_sens1
periodic
t_air_air
laten
t_air_air
periodic
...
...
我想创建一个字典,以便将 laten 和 periodic 的值分配给 t_air_sens1 等的每个键。结果必须如下所示:
{
"t_air_sens1": [laten,periodic]
"t_air_air": [laten,periodic]
...
...
}
我写了下面的代码:
prop_dict = {}
with open('file.pl') as f, open('result.pl', 'w') as procode:
for line in f:
if line[0] in prop_dict:
prop_dict[line[0]].append(line[1])
else:
prop_dict[line[0]] = [line[1]]
#will write the values in "result.pl"
但是当我尝试打印字典时,我得到的结果如下所示:
{'p': ['e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e'],
't': ['_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_',
'_', '_', '_', '_', '_', '_', '_', '_', '_'],
'l': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']}
我该怎么做才能修复它?为了获得正确的结果,我如何进行查询?
答案 0 :(得分:3)
line[0]
和line[1]
是字符串中的单个字符,而不是当前行和下一行。
文件对象是迭代器; for
循环将在每次迭代时从其中获取新行,但您也可以使用next()
function拉入另一行。使用此行一次读取两行:
prop_dict = {}
with open('file.pl') as f:
for key in f:
key = key.rstrip('\n')
# get the next line as the value
value = next(f).rstrip('\n')
prop_dict.setdefault(key, []).append(value)
我还使用dict.setdefault()
为字典中缺少的任何键插入一个空列表。与prop_dict[key]
类似,它将返回字典中的当前值,但如果没有这样的键,则在返回该空列表之前先执行prop_dict[key] = []
。
上述工作原理是for
循环在循环迭代时逐个读取行,基本上是在内部使用next()
。在循环中调用next(f)
只会引入一个额外的行,并且for
循环再次从那里继续,因此您在读取属性名称(key
)和属性值之间交替(value
)。
请注意,如果通过读取next()
循环中的最后一行到达文件末尾,StopIteration
可能会引发for
异常;这表示您的文件没有偶数行。如果这不是错误,您可以指定默认值:如果文件已用尽,next(f, '')
将返回空字符串''
。