如何处理这种嵌套字典中的递归问题?

2024-06-26 03:18:09 发布

您现在位置:Python中文网/ 问答频道 /正文

您已经从API接收到一个序列化的JSON对象,并使用标准库的JSON库对其进行了反序列化。这个物体代表了你从一个给定的祖先到下一个祖先的遗传。假设你的名字是萨利,你的祖先是珍妮特,你的基因学目标如下:

geneology_object = {
    'husband': 'Craig', 
    'wife': 'Janet',
    'children': {
        'Chris': {
            'husband': 'Chris', 
            'wife': 'Jesse',
            'children': {
                'Rebecca': {
                    'husband': 'Doug', 
                    'wife': 'Rebecca',
                }
            }
        },
        'Wonda': {
            'husband': 'Kevin', 
            'wife': 'Wonda',
            'children': {
                'Sally': {}
            }
        }
    }
}

写一个带有签名get\u generations\u down(geneology\u object,search\u name,generations=0)的函数,递归地搜索search\u name和长祖之间的代数。如果找不到名称,则递归函数将引发NameNotFoundError。你知道吗

假设上面的geneology对象,您的函数应该如下所示:

get_generations_down(geneology_object, 'Chris') 1
get_generations_down(geneology_object, 'Sally') 2

我的代码在这里,对“莎莉”不起作用

class NameNotFoundError(Exception):
    pass

count=0

def get_generations_down(geneology_object, search_name, generations=0): 

    global count

    for i in geneology_object:
        if isinstance(geneology_object[i],dict):
            if i=='children':
                generations+=1
                if search_name in geneology_object[i]:
                    count+=1
                    break  

                return
get_generations_down(geneology_object[i],search_name,generations)

        elif i == search_name:
            count+=1
            break
        elif geneology_object[i]== search_name:
            count+=1
            break
        print(geneology_object)

    if count==0:
        raise NameNotFoundError


    return generations

    #raise NotImplementedError()


get_generations_down(geneology_object, 'Sally')

Tags: namesearchgetifobjectcountsallychris
1条回答
网友
1楼 · 发布于 2024-06-26 03:18:09

您的代码似乎不是递归解决方案。你知道吗

我是这么想的

class NameNotFoundError (Exception):
    pass

def get_generations_down(geneology_object, search_name, generations=0):
    found=False
    if ('husband' in geneology_object) and ('wife' in geneology_object) and (search_name == geneology_object['husband'] or search_name == geneology_object['wife']):
            return True,generations

    if 'children' in geneology_object:
        children=(geneology_object['children'])
        generations+=1

        if search_name in children:
            return True,generations
        else:
            for child in children:
                if found:
                    break
                found,generations=get_generations_down(geneology_object['children'][child],search_name,generations)

    else:
        generations-=1
    return found,generations


result = get_generations_down(geneology_object, 'Sally')

if(result[0]):
    print (result[1])
else:
    raise NameNotFoundError()

相关问题 更多 >