深度python字典递归

Posted

技术标签:

【中文标题】深度python字典递归【英文标题】:Deep python dictionary recursion 【发布时间】:2021-11-22 12:12:41 【问题描述】:

我有一本 python 字典:

d = 
    "config": 
        "application": 
            "payment": 
                "dev": 
                    "modes": "credit,debit,emi": ,
                    "company": 
                        "address": 
                            "city": "London": ,
                            "pincode": "LD568162": ,
                        ,
                        "country": "United Kingdom": ,
                        "phone": "7865432765": ,
                    ,
                    "levels": "0,1,2": ,
                ,
                "prod": "modes": "credit,debit": , "levels": "0,1": ,
            
        
    


我想把它改成这样(如果值为空然后将键设为其父级的值)

d = 
    "config": 
        "application": 
            "payment": 
                "dev": 
                    "modes": "credit,debit,emi",
                    "company": 
                        "address": 
                            "city": "London", 
                            "pincode": "LD568162"
                        ,
                        "country": "United Kingdom",
                        "phone": "7865432765"
                    ,
                    "levels": "0,1,2"
                , 
                "prod": 
                    "modes": "credit,debit",
                    "levels": "0,1"
                
            
        
    
 

我尝试编写代码来遍历这个深度字典,但无法修改它以获得上述输出。请帮忙。

def recur(json_object):
    for x in list(json_object.items()):
        print(x)
        recur(json_object[x])

d='config': 'application': 'payment': 'dev': 'modes': 'credit,debit,emi': , 'company': 'address': 'city': 'London': , 'pincode': 'LD568162': , 'country': 'United Kingdom': , 'phone': '7865432765': , 'levels': '0,1,2': , 'prod': 'modes': 'credit,debit': , 'levels': '0,1': 

【问题讨论】:

我更新了我的答案,包括使用递归方法的另一个选项,就像你最初所做的那样。希望你也能从中有所收获。如果这是您需要的全部答案,您可以接受它作为答案:) 非常感谢@NielGodfreyPonciano 【参考方案1】:

解决方案 1

我们可以使用带有队列的非递归方法将文档的每个内部/嵌套元素排入队列,如果嵌套值只是,则将其作为值:

# d = ...

queue = [d]

while queue:
    data = queue.pop()
    for key, value in data.items():
        if isinstance(value, dict) and list(value.values()) == []:
            data[key] = list(value.keys())[0]
        elif isinstance(value, dict):
            queue.append(value)

print(d)

输出


    "config": 
        "application": 
            "payment": 
                "dev": 
                    "modes": "credit,debit,emi",
                    "company": 
                        "address": 
                            "city": "London",
                            "pincode": "LD568162"
                        ,
                        "country": "United Kingdom",
                        "phone": "7865432765"
                    ,
                    "levels": "0,1,2"
                ,
                "prod": 
                    "modes": "credit,debit",
                    "levels": "0,1"
                
            
        
    

解决方案 2

这是一种递归方法

# d = ...

def recur(data):
    for key, value in data.items():
        if isinstance(value, dict) and list(value.values()) == []:
            data[key] = list(value.keys())[0]
        elif isinstance(value, dict):
            recur(value)

recur(d)

print(d)

输出

与解决方案 1 相同

【讨论】:

以上是关于深度python字典递归的主要内容,如果未能解决你的问题,请参考以下文章

Python递归替换嵌套字典键中的字符?

python递归练习:生成一个n级深度的字典,例如:[1,2,3,4,5,6] 可以生成{1: {2: {3: {4: {6: 5}}}}},写一个函数定义n级

python Python中的递归字典合并

python Python中的递归字典合并

递归地将python对象图转换为字典

如何使用递归方法更新python字典