【问题标题】:Nested lists to nested dicts嵌套列表到嵌套字典
【发布时间】:2016-08-31 13:37:51
【问题描述】:

我有一个带有主键的列表和一个列表列表,其中每个封闭列表的第一个值(如'key_01')应是相应值的子键(如'val_01', 'val_02')。数据显示在这里:

master_keys = ["Master_01", "Master_02", "Master_03"]
data_long = [[['key_01','val_01','val_02'],['key_02','val_03','val_04'], ['key_03','val_05','val_06']],
           [['key_04','val_07','val_08'], ['key_05','val_09','val_10'], ['key_06','val_11','val_12']],
           [['key_07','val_13','val_14'], ['key_08','val_15','val_16'], ['key_09','val_17','val_18']]]

我希望将这些列表组合成一个字典,如下所示:

master_dic = {
"Master_01": {'key_01':['val_01','val_02'],'key_02': ['val_03','val_04'], 'key_03': ['val_05','val_06']}, 
"Master_02": {'key_04': ['val_07','val_08'], 'key_05': ['val_09','val_10'], 'key_06': ['val_11','val_12']}, 
"Master_03": {'key_07': ['val_13','val_14'], ['key_08': ['val_15','val_16'], 'key_09': ['val_17','val_18']}
}

到目前为止,我得到的是 sub dict:

import itertools

master_dic = {}
servant_dic = {}
keys = []
values = []
for line in data_long:
    for item in line:
        keys.extend(item[:1])
        values.append(item[1:])
servant_dic = dict(itertools.izip(keys, values))

正如预期的那样,它推出了一本字典。

servant_dic = {
'key_06': ['val_11','val_12'], 'key_04': ['val_08','val_07'], 'key_05': ['val_09','val_10'], 
'key_02': ['val_03','val_04'], 'key_03': ['val_05','val_06'], 'key_01': ['val_01','val_02']
 }

问题是,如果我想将 master_keys 添加到此字典中,以便获得想要的结果,我必须按特定顺序执行此操作,如果每行都有一个类似的计数器,这是可能的这个:

enumerated_dic =
{
0: {'key_01':['val_01','val_02'],'key_02': ['val_03','val_04'], 'key_03': ['val_05','val_06']}, 
1: {'key_04': ['val_07','val_08'], 'key_05': ['val_09','val_10'], 'key_06': ['val_11','val_12']}, 
2: {'key_07': ['val_13','val_14'], ['key_08': ['val_15','val_16'], 'key_09': ['val_17','val_18']}
}

我很想用enumerate() 来做这件事,而servant_dic 的每一行都是构建的,但不知道怎么做。从那以后,我可以简单地将计数器 0、1、2 等替换为 master_keys。

感谢您的帮助。

【问题讨论】:

    标签: python list dictionary enumerate


    【解决方案1】:
    master_keys = ["Master_01", "Master_02", "Master_03"]
    data_long = [[['key_01','val_01','val_02'],['key_02','val_03','val_04'], ['key_03','val_05','val_06']],
               [['key_04','val_07','val_08'], ['key_05','val_09','val_10'], ['key_06','val_11','val_12']],
               [['key_07','val_13','val_14'], ['key_08','val_15','val_16'], ['key_09','val_17','val_18']]]
    
    
    _dict = {}
    
    for master_key, item in zip(master_keys, data_long):
        _dict[master_key] = {x[0]: x[1:] for x in item}
    
    print _dict
    

    【讨论】:

    • 在阅读了zip()(再次)之后,我恍然大悟。 @turkus 和 @ig-melnyk,你的方法真的教会了我,我想在这里学到什么,谢谢! @mpiskore,对我来说,使用.pop() 的方法是一种非常有创意的方法。我很喜欢。
    【解决方案2】:

    希望这会有所帮助:

    {master_key: {i[0]: i[1:] for i in subkeys} for master_key, subkeys in zip(master_keys, data_long)}
    

    【讨论】:

      【解决方案3】:

      我的功能方法:

      master_dic = dict(zip(master_keys, [{k[0]: k[1::] for k in emb_list} for emb_list in data_long]))
      print(master_dic)
      

      【讨论】:

        【解决方案4】:

        您还可以使用pop 和字典理解:

        for key, elements in zip(master_keys, data_long):
            print {key: {el.pop(0): el for el in elements}}
           ...:
        {'Master_01': {'key_02': ['val_03', 'val_04'], 'key_03': ['val_05', 'val_06']}}
        {'Master_02': {'key_06': ['val_11', 'val_12'], 'key_04': ['val_07', 'val_08'], 'key_05': ['val_09', 'val_10']}}
        {'Master_03': {'key_07': ['val_13', 'val_14'], 'key_08': ['val_15', 'val_16'], 'key_09': ['val_17', 'val_18']}}
        

        【讨论】:

          猜你喜欢
          • 2018-08-02
          • 1970-01-01
          • 2017-08-30
          • 1970-01-01
          • 2021-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多