Python 从深度遍历嵌套字典并移动到顶部

Python 从深度遍历嵌套字典并移动到顶部,python,python-2.7,dictionary,openstack,Python,Python 2.7,Dictionary,Openstack,我有下面的字典(根据报告生成,因此结构可以更改)。 我需要深入字典,找到id,在本例中是'id':u'ef3c8cf1-0987-4e56-a6d5-763c42be1f75',(可能不止一个),删除该id,然后向上移动一级,重复相同的操作,直到我最终删除顶部的id。由于存在依赖项,我需要先删除孤立的id,然后移到顶部 任何帮助都是值得的。如果需要任何其他文件/信息,请告诉我 { 'id': u'4c31d813-a989-47dd-b01b-9a27b8db2dfc',

我有下面的字典(根据报告生成,因此结构可以更改)。 我需要深入字典,找到
id
,在本例中是
'id':u'ef3c8cf1-0987-4e56-a6d5-763c42be1f75'
,(可能不止一个),删除该id,然后向上移动一级,重复相同的操作,直到我最终删除顶部的
id
。由于存在依赖项,我需要先删除孤立的
id
,然后移到顶部

任何帮助都是值得的。如果需要任何其他文件/信息,请告诉我

{ 
'id': u'4c31d813-a989-47dd-b01b-9a27b8db2dfc',                                                                                                                      
'snapshots': 
    [
        {
            'id': u'3ddc7ddd-02ca-4669-a0cb-fb0d56a4a6f5', 
            'volumes': 
                [
                    {  
                        'id': u'5488de90-50dc-4d72-a6aa-c995422fa179', 
                        'snapshots': [], 
                        'snapshot_id': u'3ddc7ddd-02ca-4669-a0cb-fb0d56a4a6f5'
                    }, 
                    {
                        'id': u'e566645f-4fb3-4778-be67-447a5bdd678d', 
                        'snapshots': 
                            [
                                { 
                                    'id': u'd637f6ea-4a41-448c-874f-ffe624ddc597', 
                                    'volumes': 
                                        [
                                            { 
                                                'id': u'ef3c8cf1-0987-4e56-a6d5-763c42be1f75', 
                                                'snapshots': [], 
                                                'snapshot_id': u'd637f6ea-4a41-448c-874f-ffe624ddc597'
                                            }
                                        ]
                                }
                            ], 
                        'snapshot_id': u'3ddc7ddd-02ca-4669-a0cb-fb0d56a4a6f5'}, 
                    {
                        'id': u'196483ee-4f21-4d83-8e15-8caea532b2ab', 
                        'snapshots': [], 
                        'snapshot_id': u'3ddc7ddd-02ca-4669-a0cb-fb0d56a4a6f5'
                    }
                ]
        }
    ], 
'snapshot_id': None
}
Python代码

oh=openstack_helper.OpenstackHelper()

def get_objects(item):
    items=None
    if item == 'stacks':
        items=oh.get_stacks()
    if item == 'volumes':
        items=oh.get_volumes()
    if item == 'snapshots':
        items=oh.get_snapshots()
    return items


def dep_graph(volumes,snapshots,snapshot_id=None):
    vol_list=[]

    for volume in volumes:
        if volume.snapshot_id == snapshot_id:
            info={'id':volume.id,'snapshot_id':volume.snapshot_id,'snapshots':[],
                  }
            vol_list.append(info)
    for snapshot in snapshots:
        for volume in vol_list:
            snap_list=[]
            if snapshot.volume_id == volume['id']:
               info={'id':snapshot.id, 'volumes':[]}
               info['volumes'].extend(dep_graph(volumes,snapshots,snapshot.id))
               volume['snapshots'].append(info)
    return vol_list

if __name__ == '__main__':

    volumes = get_objects('volumes')
    snapshots = get_objects('snapshots')
    output = dep_graph(volumes, snapshots)
    print output

以下是我提出的解决方案:

def remove_id(data):
    if isinstance(data, List):
        return [remove_id(sub_data) for sub_data in data]

    if isinstance(data, Dict):
        return {key: remove_id(value) for key, value in data.items()
                if key != 'id'}

    return data
结果是:

{'snapshot_id': None,
 'snapshots': [{'volumes': [{'snapshot_id': '3ddc7ddd-02ca-4669-a0cb-fb0d56a4a6f5',
                             'snapshots': []},
                            {'snapshot_id': '3ddc7ddd-02ca-4669-a0cb-fb0d56a4a6f5',
                             'snapshots': [{'volumes': [{'snapshot_id': 'd637f6ea-4a41-448c-874f-ffe624ddc597',
                                                         'snapshots': []}]}]},
                            {'snapshot_id': '3ddc7ddd-02ca-4669-a0cb-fb0d56a4a6f5',
                             'snapshots': []}]}]}

以下是我提出的解决方案:

def remove_id(data):
    if isinstance(data, List):
        return [remove_id(sub_data) for sub_data in data]

    if isinstance(data, Dict):
        return {key: remove_id(value) for key, value in data.items()
                if key != 'id'}

    return data
结果是:

{'snapshot_id': None,
 'snapshots': [{'volumes': [{'snapshot_id': '3ddc7ddd-02ca-4669-a0cb-fb0d56a4a6f5',
                             'snapshots': []},
                            {'snapshot_id': '3ddc7ddd-02ca-4669-a0cb-fb0d56a4a6f5',
                             'snapshots': [{'volumes': [{'snapshot_id': 'd637f6ea-4a41-448c-874f-ffe624ddc597',
                                                         'snapshots': []}]}]},
                            {'snapshot_id': '3ddc7ddd-02ca-4669-a0cb-fb0d56a4a6f5',
                             'snapshots': []}]}]}

确切地说,这其中的哪一部分你被卡住了?老实说,我不知道如何进入这本字典的深度(我在stackoverflow上找到了如何获得深度),然后删除该id本身并移到顶部。这是你获取这些值或其他模式的唯一可能的方法吗?”快照值有自己的id,而对于该id,“卷”有自己的id。这不是唯一可能的方法。但这就是我现在得到的。确实,快照有自己的id,如果有卷,它也会有自己的id。你到底停留在哪一部分?老实说,我不知道如何获得这本词典的深度(我在stackoverflow上找到了如何获得深度)然后删除该id本身并移到顶部。这是获取这些值或其他模式的唯一可能方式吗?”快照值有自己的id,而对于该id,“卷”有自己的id。这不是唯一可能的方法。但这就是我现在得到的。确实,快照有自己的id,如果有卷,它将有自己的id。您的数据是一种树。我正在查看树的每个节点。如果节点是一个字典,并且包含“id”,我将删除它。然后我递归地调用该函数给节点的所有子节点。我编辑了我的代码:在dict comprehension中测试
id
键要比从初始单词中删除它好得多。你的数据是一种树。我正在查看树的每个节点。如果节点是一个字典,并且包含“id”,我将删除它。然后我递归地向节点的所有子节点调用该函数。我编辑了我的代码:在dict comprehension中测试
id
键比从最初的dictionary中删除它要好得多