我在這樣的列表中有一個層次結構。 真正的層次結構更復雜,可能會有無限的嵌套深度,它不僅僅是地板上的房間。從列表中的層次結構創建嵌套字典
locations = [
{
"loc": "root",
"id": "floor_1",
"name": "floor_1 name"
},
{
"loc": "root",
"id": "floor_2",
"name": "floor_2 name"
},
{
"loc": "floor_1",
"id": "room_1-1",
"name": "room_1-1 name"
},
{
"loc": "floor_1",
"id": "room_1-2",
"name": "room_1-2 name"
},
{
"loc": "floor_2",
"id": "room_2-1",
"name": "room_2-1 name"
}
我需要將其轉換成一個嵌套的字典是這樣的:
{
'floor_1': {
'name': 'floor_1 name',
'room_1-1': {
'name': 'room_1-1 name',
},
'room_1-2': {
'name': 'room_1-2 name',
}
},
'floor_2': {
'name': 'floor_2 name',
'room_2-1': {
'name': 'room_2-1 name',
}
}
}
我無法弄清楚如何把「名」葉與子樹到同一字典。我得到的最接近的是這樣的:
def build(loc):
children = filter(lambda l: l['loc'] == loc, locations)
return {
child['id']: {
'name': child['name'],
'xxx': build(child['id'])
}
for child in children
}
build('root')
這顯然產生了錯誤的輸出:
{'floor_1': {'name': 'floor_1 name',
'xxx': {'room_1-1': {'name': 'room_1-1 name', 'xxx': {}},
...
我想我有修真改變這樣的事情:
{ child['id']: build2(child['id']) for child in children }
但隨後我錯過了葉節點('名稱')