python利用递归去遍历多重dict

摘要:
Python中遇到多个dict。如下所示的双层dict在遍历#Double dict中的所有元素时需要双循环。dict={‘A’:{‘A1’:[1,2],‘A2’:[3,4]},‘B’:{‘B1’:[21,22],‘B2’:[23,24]}_ dict.items():ifdepth==1:yield k,velse:yield from#一个句子遍历Double dictfork,v,xinfn:print完整代码示例:Double dict和triple dict。递归函数替换多个for循环。

python中碰到多重dict,如下所示的双层dict,遍历里面的所有元素需要双重循环。现在为了代码美观,希望一句话就可以代替这样的双重for循环。

# 双重dict
_dict = {
    'A': {
        'A1': [1, 2],
        'A2': [3, 4]
    },
    'B': {
        'B1': [21, 22],
        'B2': [23, 24]
    }
}

这里的一句话其实是调用一个递归实现的函数,来替代实现这样的多层for循环

# 递归实现多重for循环的函数
def fn(_dict, depth):
    for k, v in _dict.items():
        if depth == 1:
            yield k, v
        else:
            yield from ((k, *q) for q in fn(v, depth - 1))

# 一句话遍历双重dict
for k, v, x in fn(_dict, 2):
    print(k, v, x)

完整代码示例:双重dict与三重dict,一个递归函数代替多重for循环。达成功能:python使用递归函数来代替多重for循环,使得一句话可以遍历深层的dict。

# -*- coding:utf-8 -*-
# 递归实现多重for循环的函数
def fn(_dict, depth):
    for k, v in _dict.items():
        if depth == 1:
            yield k, v
        else:
            yield from ((k, *q) for q in fn(v, depth - 1))


# 双重dict
_dict = {
    'A': {
        'A1': [1, 2],
        'A2': [3, 4]
    },
    'B': {
        'B1': [21, 22],
        'B2': [23, 24]
    }
}
# 一句话遍历双重dict
for k, v, x in fn(_dict, 2):
    print(k, v, x)
print()
print()

# 三重dict
_dict = {
    # 'A': {
    #     'A1': [1, 2],
    #     'A2': [3, 4]
    # },
    # 'B': {
    #     'B1': [21, 22],
    #     'B2': [23, 24]
    # },
    'C': {
        'C1': {
            'c11': 'c11'
        },
        'C2': {
            'c21': 'c21',
            'c22': 'c22'
        }
    },
    'D': {
        'D1': {
            'd11': 123
        }
    }
}
# 一句话遍历三重dict
for k, v, x, y in fn(_dict, 3):
    print(k, v, x, y)
print()
print()


# 土方法的三重循环,太丑了
for k1, v1 in _dict.items():
    for k2, v2 in v1.items():
        for k3, v3 in v2.items():
            print(k1, k2, k3, v3)
A A1 [1, 2]
A A2 [3, 4]
B B1 [21, 22]
B B2 [23, 24]


C C1 c11 c11
C C2 c21 c21
C C2 c22 c22
D D1 d11 123


C C1 c11 c11
C C2 c21 c21
C C2 c22 c22
D D1 d11 123

免责声明:文章转载自《python利用递归去遍历多重dict》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Celery 3.x 升级至 celery 4.x(转)Centos8 如何配置DHCP服务器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

pip 安装

一、说明 CentOS6.5自带python环境为2.6,公司的python环境为2.7. 为了避免出现以后代码出现版本差异,所以把自带的2 .6版本升级到了2.7,过程十分曲折。。。。 中途遇到的问题和解决方法请点击:Python安装时遇到的问题 二、安装步骤 1、下载安装包 官方下载地址为:https://www.python.org/download...

原创:python的requests.post()向后端传递数据,数组结构需将python数据结果转换成JSON

 针对采集来的数据,用requests.post()向后端传递 如果是python数据结构如数组,需要转换成为JSON对象,否则后端容易解析不成后端集合的对象结构 re 一:python做为前端请求requests.post() ''' 后台接收是数组 ''' dataInfoList = [...

python 下载安装setuptools及pip应用

1、首先下载python安装程序,下载地址:https://www.python.org/download/releases/2.7.8/   如下图:     因为我的机器是32位的就选择了Windows x86 MSI Installer (2.7.8)   安装成功后 2、下载安装setuptools   具体办法:   进入页面:https://...

Python生成pyd文件

Python的脚本文件是开源的,量化策略的安全性没有保障。因此需要保护源码。那么要对Python代码进行混淆、加密保护。 混淆代码,我准备使用pyminifier。而加密处理,就比较麻烦。 Python有py、pyc、pyw、pyo、pyd等文件格式。 其中,pyc是二进制文件。但很容易被反编译。 pyw也不行,只是隐藏命令行界面而已,可以作为入口脚本。...

(python learn) 5 元组

首先我们要知道,字符串,元组,还有列表等数据类型在python中都属于序列数据类型。对这种数据类型,有一些统一的函数可用,比如: len() 可以返回长度 +可以连接两个序列 *可以重复两个序列中的元素 in可以判断某个元素是否在序列中 max()返回最大元素 min()返回最小元素 cmp()比较两个序列是否相等 下面,我们研究一下元组。 元组是一组被逗...

jenkins部署python语言webUI自动化项目

前置条件:我使用的系统是ubuntu20.04,linux系统,使用的war包本地安装jenkins 本地PyCharm运行WebUI项目 下载项目代码 git clone https://gitee.com/iread9527/iSelenium_Python.git 使用pycharm打开项目,本地安装selenium以及项目依赖的第三方库...