【问题标题】:Python: Convert table to string to key:value pairs and store in nested dict using comprehension [duplicate]Python:将表转换为字符串到键:值对并使用理解存储在嵌套字典中[重复]
【发布时间】:2019-07-12 10:46:24
【问题描述】:

我从子进程命令中接收到字符串形式的数据。我想使用字典理解将此数据存储在嵌套字典中。我该怎么做呢?注意:每个子流程命令的表格行和列会有所不同。

这只是一个示例:(我已将其作为字符串从子进程返回。)

NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0     7:0    0 140.7M  1 loop /snap/gnome-3-26-1604/82
loop1     7:1    0  89.3M  1 loop /snap/core/6673
sda       8:0    0    11G  0 disk 
├─sda1    8:1    0  10.9G  0 part /
├─sda14   8:14   0     4M  0 part 
└─sda15   8:15   0   106M  0 part /boot/efi

这是我想要的输出:

{block device 1: 
    { "name" :  value,
    "maj:min" : value,
    "RM" : value,
    "SIZE" : value,
    "RO": value,
    "TYPE": value,
    "MOUNTPOINT" : value},
 block device 2: 
     { "name" :  value,
    "maj:min" : value,
    "RM" : value,
    "SIZE" : value,
    "RO": value,
    "TYPE": value,
    "MOUNTPOINT" : value},
...
}

这是我用来排序的方法(我知道这很讨厌)。

def multiple_column_dict(a_string, cat):

    lines = re.split("\n", a_string)
    keys = re.split(" +", lines[0])

    values1 = re.split(" +", lines[1])
    values2 = re.split(" +", lines[2])
    values3 = re.split(" +", lines[3])
    values4 = re.split(" +", lines[4])
    values5 = re.split(" +", lines[5])
    values6 = re.split(" +", lines[6])

    a_dict1 = dict(zip(keys, values1))
    a_dict2 = dict(zip(keys, values2))
    a_dict3 = dict(zip(keys, values3))
    a_dict4 = dict(zip(keys, values4))
    a_dict5 = dict(zip(keys, values5))
    a_dict6 = dict(zip(keys, values6))

【问题讨论】:

    标签: python list dictionary dictionary-comprehension


    【解决方案1】:

    你可以使用

    # -*- coding: utf-8 -*-
    
    data = """
    NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    loop0     7:0    0 140.7M  1 loop /snap/gnome-3-26-1604/82
    loop1     7:1    0  89.3M  1 loop /snap/core/6673
    sda       8:0    0    11G  0 disk 
    ├─sda1    8:1    0  10.9G  0 part /
    ├─sda14   8:14   0     4M  0 part 
    └─sda15   8:15   0   106M  0 part /boot/efi
    """
    
    header = ["NAME", "MAJ:MIN", "RM", "SIZE", "RO", "TYPE", "MOUNTPOINT"]
    
    result = [dict(zip(header, values))
              for line in data.split("\n")[2:]
              if line
              for values in [line.split()]]
    
    print(result)
    

    这会产生

    [
     {'NAME': 'loop0', 'MAJ:MIN': '7:0', 'RM': '0', 'SIZE': '140.7M', 'RO': '1', 'TYPE': 'loop', 'MOUNTPOINT': '/snap/gnome-3-26-1604/82'},
     {'NAME': 'loop1', 'MAJ:MIN': '7:1', 'RM': '0', 'SIZE': '89.3M', 'RO': '1', 'TYPE': 'loop', 'MOUNTPOINT': '/snap/core/6673'},
     {'NAME': 'sda', 'MAJ:MIN': '8:0', 'RM': '0', 'SIZE': '11G', 'RO': '0', 'TYPE': 'disk'},
     {'NAME': '├─sda1', 'MAJ:MIN': '8:1', 'RM': '0', 'SIZE': '10.9G', 'RO': '0', 'TYPE': 'part', 'MOUNTPOINT': '/'},
     {'NAME': '├─sda14', 'MAJ:MIN': '8:14', 'RM': '0', 'SIZE': '4M', 'RO': '0', 'TYPE': 'part'},
     {'NAME': '└─sda15', 'MAJ:MIN': '8:15', 'RM': '0', 'SIZE': '106M', 'RO': '0', 'TYPE': 'part', 'MOUNTPOINT': '/boot/efi'}
    ]
    

    在这里,我们生成一个字典列表。

    【讨论】:

    • 看起来 TYPEMOUNTPOINT 是 2 个不同的键
    • @Rakesh:你说得对,我需要更改 header 数组。感谢您发现它。
    猜你喜欢
    • 2019-11-22
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2018-12-25
    • 2013-05-08
    相关资源
    最近更新 更多