我在这样的列表中有一个层次结构。 真正的层次结构更复杂,可能会有无限的嵌套深度,它不仅仅是地板上的房间。从列表中的层次结构创建嵌套字典
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 }
但随后我错过了叶节点('名称')