簡體   English   中英

從列表列表創建嵌套字典

[英]Creating a nested dictionary from list of lists

我正在嘗試將下面的列表列表轉換為具有"epc_hlx"鍵值的嵌套字典list of dictionary因為它可以包含多個這樣的字典元素:

      "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']]

這是預期的 Output

{
   "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']]

  1. 將所有 None 值作為字符串。 (我需要一個包含 None 的列表以使其長度相等,這就是使用 pandas 數據幀的原因)

df = pd.DataFrame(li)
df[2] = df[2].astype(str)
df[3] = df[3].astype(str)

lst = df.values 

借用史蒂文的答案

d = {}

for path in lst:
    current_level = d
    for part in path:
        if part not in current_level:
            current_level[part] = {}
        current_level = current_level[part]

Output:

d:

{'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)

import ast
ast.literal_eval(s)  

{'header': {'aircraft': {},
  'engine_1': {'epc_hlx': {'measure': {}, 'ts': {}}},
  'engine_2': {'epc_hlx': {'measure': {}, 'ts': {}}}}}

因此,感謝發布先前答案的 Pygirl,我終於找到了解決方案。

首先要做的是將我的輸入列表修改為:

allblocs=[['header', 'aircraft'],
          ['header', 'engine_1', 'epc_hlx', 'measure'],
          ['header', 'engine_2', 'epc_hlx', 'measure']]

然后我重用了 https://stackoverflow.com/a/7654004/6660373並為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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM