Python 从列表列表创建嵌套字典

Python 从列表列表创建嵌套字典,python,dictionary,Python,Dictionary,我正在尝试将下面的列表列表转换为一个嵌套字典,其中包含“epc_hlx”键值,作为一个字典列表,因为它可以包含多个字典元素,如下所示: "epc_hlx":[ { "measure":{ } }, { "measure":{ }

我正在尝试将下面的列表列表转换为一个嵌套字典,其中包含
“epc_hlx”
键值,作为一个
字典列表
,因为它可以包含多个字典元素,如下所示:

      "epc_hlx":[
           {
              "measure":{
              }
           },
           {
              "measure":{
              }
           }
       ]
列表:

lst =[['header', 'aircraft'],
['header', 'engine_1'],
['header', 'engine_2'],
['header', 'engine_1', 'epc_hlx'],
['header', 'engine_1', 'epc_hlx', 'measure'],
['header', 'engine_2', 'epc_hlx'],
['header', 'engine_2', 'epc_hlx', 'measure']]
{'header': {'aircraft': {'None': {'None': {}}},
  'engine_1': {'None': {'None': {}},
   'epc_hlx': {'None': {}, 'measure': {}, 'ts': {}}},
  'engine_2': {'None': {'None': {}},
   'epc_hlx': {'None': {}, 'measure': {}, 'ts': {}}}}}
以下是预期输出:

{
   "header":{
       "aircraft":{
       },
       "engine1":{
          "epc_hlx":[
               {
                  "measure":{
                  }
               }
           ]
       },
       "engine2":{
          "epc_hlx":[
               {
                  "measure":{
                  }
               }
           ]
       }
    }
}

我试过一些方法,但没有一种方法能达到我想要的效果。所以我被困在这个问题上了。提前感谢您的帮助

我不知道这是否完全符合您的要求。但它会给你一个想法。您可以优化解决方案

li = [['header', 'aircraft'],
['header', 'engine_1'],
['header', 'engine_2'],
['header', 'engine_1', 'epc_hlx'],
['header', 'engine_1', 'epc_hlx', 'measure'],
['header', 'engine_1', 'epc_hlx', 'ts'],
['header', 'engine_2', 'epc_hlx'],
['header', 'engine_2', 'epc_hlx', 'measure'],
['header', 'engine_2', 'epc_hlx', 'ts']]

  • 将所有“无”值设置为字符串。(我需要一个包含None的列表,使其长度相等,这就是为什么使用pandas dataframe)


  • 借用


    输出:

    lst =[['header', 'aircraft'],
    ['header', 'engine_1'],
    ['header', 'engine_2'],
    ['header', 'engine_1', 'epc_hlx'],
    ['header', 'engine_1', 'epc_hlx', 'measure'],
    ['header', 'engine_2', 'epc_hlx'],
    ['header', 'engine_2', 'epc_hlx', 'measure']]
    
    {'header': {'aircraft': {'None': {'None': {}}},
      'engine_1': {'None': {'None': {}},
       'epc_hlx': {'None': {}, 'measure': {}, 'ts': {}}},
      'engine_2': {'None': {'None': {}},
       'epc_hlx': {'None': {}, 'measure': {}, 'ts': {}}}}}
    
    d:

    lst =[['header', 'aircraft'],
    ['header', 'engine_1'],
    ['header', 'engine_2'],
    ['header', 'engine_1', 'epc_hlx'],
    ['header', 'engine_1', 'epc_hlx', 'measure'],
    ['header', 'engine_2', 'epc_hlx'],
    ['header', 'engine_2', 'epc_hlx', 'measure']]
    
    {'header': {'aircraft': {'None': {'None': {}}},
      'engine_1': {'None': {'None': {}},
       'epc_hlx': {'None': {}, 'measure': {}, 'ts': {}}},
      'engine_2': {'None': {'None': {}},
       'epc_hlx': {'None': {}, 'measure': {}, 'ts': {}}}}}
    

    使用正则表达式清理
    'None':{}

    reg = re.compile("'None': {}")
    
    s = str(d)
    while (len(re.findall("'None': {}", s))):
        s = re.sub("'None': {}", '', s)
        
    s = re.sub("{,", '{', s)
    



    多亏Pygirl发布了之前的答案,我终于找到了解决方案

    li = [['header', 'aircraft'],
    ['header', 'engine_1'],
    ['header', 'engine_2'],
    ['header', 'engine_1', 'epc_hlx'],
    ['header', 'engine_1', 'epc_hlx', 'measure'],
    ['header', 'engine_1', 'epc_hlx', 'ts'],
    ['header', 'engine_2', 'epc_hlx'],
    ['header', 'engine_2', 'epc_hlx', 'measure'],
    ['header', 'engine_2', 'epc_hlx', 'ts']]
    
    首先要做的是将我的输入列表修改为:

    allblocs=[['header', 'aircraft'],
              ['header', 'engine_1', 'epc_hlx', 'measure'],
              ['header', 'engine_2', 'epc_hlx', 'measure']]
    
    然后我重新使用并添加了
    epc_hlx
    键的逻辑,该键为我提供了以下代码:

    dict_header={}    
    for blocs in allblocs :
        current_lvl=dict_header
        for bloc in blocs : 
            if bloc not in current_lvl:
               if(bloc == "epc_hlx"):
                   current_lvl[bloc]=[]
                   current_lvl=current_lvl[bloc]
               elif(bloc == "measure"):
                   dict_tmp={}
                   dict_tmp[bloc]={}
                   current_lvl.append(dict_tmp)
               else:
                   current_lvl[bloc]={}
                   current_lvl=current_lvl[bloc]
            else:
                   current_lvl=current_lvl[bloc]
    

    为什么epc_hlx映射到一个列表?因为我将有几个{“measure”:{},“ts”:{}哦,我明白了。我看不出你的问题中提到过这一点,是吗?为什么
    epc_hlx
    将列表作为值,所有其他的都有dict?有什么具体的原因吗?是的,因为
    epc_hlx
    将包含如下8条命令:
    {“measure”:{},“ts”:{}
    非常感谢,我会这样搜索,如果成功,我会接受你的答案:)你只需要添加
    epc_hlx的逻辑:[{…}]
    。是的,我肯定我认为这是一条路,我要去吃午饭,然后我会试试!我没有结束这个问题。我不能删除评论。但是我撤销了你违背我建议的尝试。评论会被当选的主持人删除(我不是这样的)如果有几个用户认为他们很粗鲁。得到答案,即使是技术上正确的答案对你有帮助,也不能证明问题是好的,许多用户都渴望在遵守规则方面赢得声誉。至少有5个人不同意你的意见,认为你知道如何问一个好问题。如果其中三个人有一定的特权您的问题在得到改进之前将被关闭。描述尝试的内容将是一个很好的编辑,更详细地说明失败的原因。但是,请避免外部链接。用户喜欢直接在帖子中提供信息。