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
  • 相关阅读:
    OMNETPP: tictoc
    OMNETPP安装
    Unified SR
    SCM
    DC tunnel
    AIMD
    AQM
    MANAGER POJ1281 C语言
    Pascal Library C语言 UVALive3470
    The 3n + 1 problem C语言 UVA100
  • 原文地址:https://www.cnblogs.com/taoshiqian/p/9203448.html
Copyright © 2011-2022 走看看