Python(17)递归实现获取多维嵌套字典所有层级的key和value

使用递归函数,获取多维嵌套字典所有层级的key和value,且key带路径

取深层的value值,并把key值得每一层都显示,例如下文中的测试字典raw_dict的server-addr展示为spring.cloud.nacos.discovery.server-addr': 'nacos.al:8848'

实现代码如下

raw_dict={
	'spring': {
		'cloud': {
			'nacos': {
				'discovery': {
					'server-addr': 'nacos.al:8848'
				}
			}
		},
		'datasource': {
			'url': 'jdbc:mysql://rm-3ns202ceq03dayyg8.mysql.rds.aliyuncs.com:3306/xxx?useUnicode=true&characterEncoding=utf8&useSSL=false',
			'username': 'app',
			'password': '123456'
		}
	},
	'dubbo': {
		'registry': {
			'address': 'nacos://nacos.al:8848'
		}
	},
	'custom-config': {
		'bill-config': {
			'extension-config': {
				'extensionMultiPrepaymentRNVersion': 200,
				'multiCashInstallmentByRNVersion': 502,
				'extensionInstallment2PDL': 200
			},
			'grayscaleNewVersionTagId': 6463
		},
		'credit-config': {
			'cash-loan-config': {
				'blacklist': []
			},
			'cash-installment-config': {
				'blacklist': []
			}
		},
		'financial-page-config': {
			'newVersion4NotLogin': True,
			'newVersion4AllLogin': True,
			'newVersionTailNumberSet': [0, 1, 2, 3, 4, 5, 7, 8, 9]
		},
		'repayment-config': {
			'combinerRepayDisabledTagId': 5905
		},
		'payCenterConfigMap': {
			'afi': {
				'bizCode': 'afiRP',
				'secretKey': '112233445566'
			}
		}
	},
	'asetku': {
		'loan': {
			'host': 'http://test.supermarket'
		}
	},
	'kms': {
		'appId': 'xxx',
		'token': '12f3b4b5-678d-9cec-af12-dc12e34f5ad6'
	}
}


class AnalyzeDataUtil:
    def __init__(self, datas):
        self.datas = datas

    def analyze_data(self, data, result="raw_dict"):
    """多维/嵌套字典数据无限遍历,获取所有key层和value
        :param data:
        :param result:
        :return:
        """
        if isinstance(data, dict): #使用isinstance检测数据类型:字典类型
            for k,v in data.items():
                self.analyze_data(v, result+".%s" %str(k))
        elif isinstance(data,(list, tuple)): #列表或元组类型
            for i in range(len(data)):
                self.analyze_data(data[i], result+"[%s]" %i) # 自我调用实现无限遍历
        else:
            # print(result + "=" + str(data))
            self.datas[result] = str(data)

if __name__ == '__main__':
    t = AnalyzeDataUtil({})  # 传入空字典{},即datas初始值为{}
    t.analyze_data(raw_dict,result="raw_dict")  #执行过程
    print(t.datas) # 最终需要的是类属性datas

返回结果如下

{'raw_dict.spring.cloud.nacos.discovery.server-addr': 'nacos.al:8848', 
'raw_dict.spring.datasource.url': 'jdbc:mysql://rm-3ns202ceq03dayyg8.mysql.rds.aliyuncs.com:3306/personal_service?useUnicode=true&characterEncoding=utf8&useSSL=false', 
'raw_dict.spring.datasource.username': 'app', 
'raw_dict.spring.datasource.password': '123456', 
'raw_dict.dubbo.registry.address': 'nacos://nacos.al:8848', 
'raw_dict.custom-config.bill-config.extension-config.extensionMultiPrepaymentRNVersion': '200', 'raw_dict.custom-config.bill-config.extension-config.multiCashInstallmentByRNVersion': '502', 'raw_dict.custom-config.bill-config.extension-config.extensionInstallment2PDL': '200', 
'raw_dict.custom-config.bill-config.grayscaleNewVersionTagId': '6463', 
'raw_dict.custom-config.financial-page-config.newVersion4NotLogin': 'True', 
'raw_dict.custom-config.financial-page-config.newVersion4AllLogin': 'True', 
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[0]': '0', 
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[1]': '1', 
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[2]': '2', 
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[3]': '3', 
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[4]': '4', 
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[5]': '5', 
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[6]': '7', 
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[7]': '8', 
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[8]': '9', 
'raw_dict.custom-config.repayment-config.combinerRepayDisabledTagId': '5905', 
'raw_dict.custom-config.payCenterConfigMap.afi.bizCode': 'afiRP', 
'raw_dict.custom-config.payCenterConfigMap.afi.secretKey': '112233445566', 
'raw_dict.asetku.loan.host': 'http://test.supermarket', 
'raw_dict.kms.appId': 'xxx', 
'raw_dict.kms.token': '12f3b4b5-678d-9cec-af12-dc12e34f5ad6'}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值