Python 在混合目录/列表中查找父同级

Python 在混合目录/列表中查找父同级,python,linux,dictionary,nested,Python,Linux,Dictionary,Nested,我想在此数组中找到父兄弟 arr = { 'children': [ { 'id':'item_1', 'title':'Item 1', 'children': [ { 'id':'item_a', 'title':'Item A' },

我想在此数组中找到父兄弟

arr = {
    'children': [
        {
            'id':'item_1',
            'title':'Item 1',
            'children': [
                {
                    'id':'item_a',
                    'title':'Item A'
                },
                {
                    'id':'item_b',
                    'title':'Item B'
                },
                {
                    'id':'item_c',
                    'title':'Item C',
                    'children': [
                        {
                            'id':'item_i',
                            'title':'Item I'
                        },
                        {
                            'id':'item_ii',
                            'title':'Item II'
                        }
                    ]
                }
            ]
        }
    ]
}
例如,如果我将“item_b”放入方法中,它必须返回“item_1”(忽略作为父项的“children”)。类似于此:

>>> parent = get_parent(arr, 'item_i', ['children'])
>>> parent['id']
item_c
>>> parent = get_parent(arr, 'item_1', ['children'])
>>> parent['id']
None
我的id是唯一的,所以我知道只有一个父母

我已经看过了和的例子,但我不知道如何将它们变成我想要的。Claudius解决方案看起来方向正确,但对于我的数组,它只返回
[]


编辑: ewcz解决方案非常有效。我对其进行了一些修改,以允许获得标题:

def get_parent(arr, item_id):
    L = [(None, arr)]
    while L:
        parent_item, item = L.pop()
        curr_id = item.get('id', None)
        if curr_id == item_id:
            return parent_item

        children = item.get('children', [])
        for child in children:
            L.append((item, child))

parent = get_parent(arr, 'item_i')
print(parent.get('id'))
print(parent.get('title'))

一个选项是遍历数组,并在遍历命中感兴趣的项时立即返回父id:

def get_parent(arr, item_id):
    L = [(None, arr)]
    while L:
        parent_id, item = L.pop()

        curr_id = item.get('id', None)
        if curr_id == item_id:
            return parent_id

        children = item.get('children', [])
        for child in children:
            L.append((curr_id, child))

parent = get_parent(arr, 'item_i')

你确定书名中的“兄弟姐妹”这个词吗?从描述来看,您似乎只需要父项。同级项应该是那些共享父项的项,如您的示例中的
item_i
item_ii
。@gereleth您可能是对的,但我认为
id
title
子项的同级项。我最近学习了a*算法,现在我发现@ewcz代码与该算法非常相似。我只是觉得这可能会对谷歌的人有所帮助:)谢谢!在我的帖子中看到修改后的解决方案。@NinjaFart我很高兴,尽管我认为修改将直接给您指定id的元素,而不是它的父元素…Ups,您是正确的。我已经更新了我的帖子-现在应该可以工作了。