[英]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']]
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.