如果我有文件:
;;;
;;;
;;;
A 1 2 3
B 2 3 4
C 3 4 5
我想把它读成{str:list of str}字典:
{'A': ['1', '2', '3'], 'B': ['2', '3', '4'], 'C': ['3', '4', '5']
我有以下代码:
d = {}
with open('file_name') as f:
for line in f:
while ';;;' not in line:
(key, val) = line.split(' ')
#missingcodehere
return d
我应该在line.split之后放入什么来将键和值分配为str和str列表?
答案 0 :(得分:4)
专注于您的代码以及您做错了什么。
你的while ';;;' not in line
几乎无限循环。因此,您希望根据尝试将数据插入字典的方式更改逻辑。只需使用条件语句检查if ';;;'
是否在您的行中。
然后,当您从line.strip().split(' ')
获取密钥和值时,只需将其分配到字典d[key] = val
即可。但是,您需要一个列表,此时val当前是一个字符串,因此也可以在val上调用split。
此外,您 不需要key and val
附近的括号。它为您的代码提供了不需要的 noise 。
最终结果将为您提供:
d = {}
with open('new_file.txt') as f:
for line in f:
if ';;;' not in line:
key, val = line.strip().split(' ')
d[key] = val.split()
print(d)
使用您的样本输入,输出为:
{'C': ['3', '4', '5'], 'A': ['1', '2', '3'], 'B': ['2', '3', '4']}
最后,为实现提供改进,因为它可以成为更多Pythonic 。我们可以简化这些代码并提供一个小的改进,以便更一般地分割,而不是计算显式空格:
with open('new_file.txt') as fin:
valid = (line.split(None, 1) for line in fin if ';;;' not in line)
d = {k:v.split() for k, v in valid}
因此,在上文中,您会注意到我们的拆分看起来像这样:split(None, 1)
。我们在哪里提供maxsplit=1
。
根据split
的文档字符串,它解释得非常好:
返回S中单词的列表,使用sep作为 分隔符字符串。如果给出maxsplit,最多是maxsplit 分裂完成。如果未指定sep或者为None,则为any 空白字符串是一个分隔符,空字符串是 从结果中删除。
最后,我们只使用字典理解来获得最终结果。
答案 1 :(得分:0)
为什么不简单:
def make_dict(f_name):
with open(f_name) as f:
d = {k: v.split()
for k, v in [line.strip().split(' ')
for line in f
if ';;;' not in line]}
return d
然后
>>> print(make_dict('file_name'))
{'A': ['1', '2', '3'], 'B': ['2', '3', '4'], 'C': ['3', '4', '5']}