【问题标题】:Printing a text file as a dictionary python将文本文件打印为字典 python
【发布时间】:2019-12-26 12:24:57
【问题描述】:

我正在处理的文本文件

3:d:10:i:30
1:d:10:i:15
4:r:30
1:r:15
2:d:12:r:8
4:l:20
5:i:15
3:l:20:r:22
4:d:30
5:l:15:r:15

我正在尝试从一个文本文件中打印一个字典,它应该看起来像:

{1: {'d': 10, 'i': 15, 'r': 15},
2: {'d': 12, 'r': 8},
3: {'d': 10, 'i': 30, 'l': 20, 'r': 22},
4: {'d': 30, 'l': 20, 'r': 30},
5: { 'i': 15, 'l': 15, 'r': 15}}

相反,我的代码覆盖了文件中的每一行,并且只将最近的一行作为字典中的值,所以它看起来像:

 {'3': {'l': '20', 'r': '22'}, 
 '1': {'r': '15'}, 
 '4': {'d': '30'}, 
 '2': {'d': '12', 'r': '8'}, 
 '5': {'l': '15', 'r': '15'}})

这是我目前所拥有的

def read_db(file):
d = defaultdict(dict)
for line in open('db1.txt'):
    z = line.rstrip().split(':')
    d[z[0]]=dict( zip(z[1::2],z[2::2]))
print(d)

我尝试执行 += 但该操作数不适用于 dict。我有点卡住了。感谢您的帮助

【问题讨论】:

    标签: python file dictionary


    【解决方案1】:

    这是一种使用简单迭代和dict.setdefault 的方法。

    例如:

    res = {}
    with open(filename) as infile:           #Open file to read
        for line in infile:                  #Iterate Each line 
            line = line.strip().split(":")   #Split by colon
            res.setdefault(line.pop(0), {}).update(dict(zip(line[::2], line[1::2])))    
    
    print(res)
    

    输出:

    {'1': {'d': '10', 'i': '15', 'r': '15'},
     '2': {'d': '12', 'r': '8'},
     '3': {'d': '10', 'i': '30', 'l': '20', 'r': '22'},
     '4': {'d': '30', 'l': '20', 'r': '30'},
     '5': {'i': '15', 'l': '15', 'r': '15'}}
    

    或者使用collections.defaultdict

    例如:

    from collections import defaultdict
    res = defaultdict(dict)
    with open(filename) as infile:
        for line in infile:
            line = line.strip().split(":")
            res[line.pop(0)].update(dict(zip(line[::2], line[1::2])))
    
    print(res)
    

    输出:

    defaultdict(<class 'dict'>,
                {'1': {'d': '10', 'i': '15', 'r': '15'},
                 '2': {'d': '12', 'r': '8'},
                 '3': {'d': '10', 'i': '30', 'l': '20', 'r': '22'},
                 '4': {'d': '30', 'l': '20', 'r': '30'},
                 '5': {'i': '15', 'l': '15', 'r': '15'}})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 2020-12-16
      • 2023-03-15
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多