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,您是正确的。我已经更新了我的帖子-现在应该可以工作了。