为文件中的键附加多个值
Append multiple values for a key from a file
我有一个类似于下面的文件:
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']}
我该如何解决?我需要如何进行查询才能获得正确的结果?
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]
一样,它将 return 字典中的当前值,但如果没有这样的键, prop_dict[key] = []
在 return 那个空列表之前先执行。
上面的工作原理是 for
循环在循环迭代时逐行读取,基本上是在内部使用 next()
。在循环中调用 next(f)
只是简单地画了一条额外的线,然后 for
循环再次从那里继续,所以你在读取 属性 名称(key
)之间交替,和一个 属性 值 (value
).
请注意,如果通过读取 for
循环中的最后一行到达文件末尾,next()
会引发 StopIteration
异常;这表明您的文件没有偶数行。如果这不是错误,您可以指定一个默认值:如果文件已用完,next(f, '')
将 return 空字符串 ''
。
我有一个类似于下面的文件:
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']}
我该如何解决?我需要如何进行查询才能获得正确的结果?
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]
一样,它将 return 字典中的当前值,但如果没有这样的键, prop_dict[key] = []
在 return 那个空列表之前先执行。
上面的工作原理是 for
循环在循环迭代时逐行读取,基本上是在内部使用 next()
。在循环中调用 next(f)
只是简单地画了一条额外的线,然后 for
循环再次从那里继续,所以你在读取 属性 名称(key
)之间交替,和一个 属性 值 (value
).
请注意,如果通过读取 for
循环中的最后一行到达文件末尾,next()
会引发 StopIteration
异常;这表明您的文件没有偶数行。如果这不是错误,您可以指定一个默认值:如果文件已用完,next(f, '')
将 return 空字符串 ''
。