分割后添加字典键和值?

时间:2016-04-01 01:01:45

标签: python dictionary

如果我有文件:

;;;
;;;
;;;
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列表?

2 个答案:

答案 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']}