zoukankan      html  css  js  c++  java
  • python利用递归去遍历多重dict

    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
  • 相关阅读:
    web服务器-Apache
    nginx优化
    nginx下载限速
    nginx-URL重写
    HDU 5358 First One 求和(序列求和,优化)
    HDU 5360 Hiking 登山 (优先队列,排序)
    HDU 5353 Average 糖果分配(模拟,图)
    UVALive 4128 Steam Roller 蒸汽式压路机(最短路,变形) WA中。。。。。
    HDU 5348 MZL's endless loop 给边定向(欧拉回路,最大流)
    HDU 5344 MZL's xor (水题)
  • 原文地址:https://www.cnblogs.com/taoshiqian/p/9203448.html
Copyright © 2011-2022 走看看