json 如何使用递归递增变量

xqkwcwgp  于 2023-03-24  发布在  其他
关注(0)|答案(1)|浏览(122)

我的职务:

def flat(errors: dict) -> dict:
    result = {}
    def inner(errors, key=None):
        if type(errors) is dict:
            for k, v in errors.items():
                inner(v, k)
        elif type(errors) is list:
            for obj in errors:
                inner(obj)
        else:
            result.update({key: errors})
    inner(errors)
    return result

儿子:

errors = {
    "last_name": "Имя должно состоять из букв",
    "birth_place": {
        "address": {
            "parts": [
                {
                    "0": {
                        "id": "Неверный идентификатор",
                    },
                },
                {
                    "1": {
                        "id": "Неверный идентификатор",
                    },
                },
            ],
        },
    },
    "groups": [
        {
            "1": "Группа workers не существует",
        },
    ],
}

我需要这样的输出:

{
    "last_name": "Имя должно состоять из букв",
    "birth_place.address.parts.0.id": "Неверный идентификатор",
    "birth_place.address.parts.1.id": "Неверный идентификатор",
    "groups.1": "Группа workers не существует",
}

我得到这个:

{'last_name': 'Имя должно состоять из букв', 'id': 'Неверный идентификатор', '1': 'Группа workers не существует'}

我怎么能用递归递增一个字符串变量?我有递归思维的问题

uz75evzq

uz75evzq1#

它只需要一个小的变化,你需要过去的列表到inner,所以你可以继续追加下一级的关键字到该列表。然后只需使用join使最后一个键:

def flat(errors: dict) -> dict:
    result = {}
    def inner(errors, key=[]):
        if type(errors) is dict:
            for k, v in errors.items():
                inner(v, key+[k])
        elif type(errors) is list:
            for obj in errors:
                inner(obj, key)
        else:
            result.update({'.'.join(key): errors})
    inner(errors)
    return result

print(flat(errors))

输出:

{'last_name': 'Имя должно состоять из букв', 'birth_place.address.parts.0.id': 'Неверный идентификатор', 'birth_place.address.parts.1.id': 'Неверный идентификатор', 'groups.1': 'Группа workers не существует'}

声明一下,使用key=[]作为缺省参数有些危险,但在本例中,由于我从未修改过key,因此使用它是安全的。

相关问题