Python中对具有逻辑结构的字典进行展开为列表

利用字典存储树图,如何展开为列表呢?

来源:我的一个小代码称盐程序设计https://github.com/wan230114/chenyan-python/blob/master/V3/expand_dict.py

# -*- coding: utf-8 -*-
# @Author: ChenJun
# @Qmail:  1170101471@qq.com
# @Date:   2019-12-24 11:05:08
# @Last Modified by:   JUN
# @Last Modified time: 2019-12-24 21:38:24

"""
遍历输出嵌套字典

假如存在字典:
D = {
    1: {21: {28: {},
             29: {},
             30: {300: {301: {302: {}}}},
             32: {300: {}}},
        22: {33: {}}}, }

字典关系:
1   21  28
        29
        30  300 301 302
        32  300
    22  33

需要输出以下结果,如何实现呢?
结果:
1   21  28
1   21  29
1   21  30  300 301 302
1   21  32  300
1   22  33
"""

from pprint import pprint


def expand_values(D):
    L = []
    i = -1
    for key in D.copy():
        i += 1
        D_key_len = len(D[key])
        if i == 0:
            # print('key:', key, "len:", D_key_len)
            if not D[key]:
                L.append([key, D_key_len + 1])
                D.pop(key)
                # print('-'*50)
            else:
                L.append([key, D_key_len])
                L += expand_values(D[key])
    return L


def expand_dict(D):
    L_result = []
    # 开头处理
    # print('遍历开始:')
    L = Ltmp = expand_values(D)
    # print(L)
    L_clean = [x[0] for x in L]
    L_result.append(L_clean)
    # 循环处理
    while D:
        L = expand_values(D)  # 递归生成多个行的序列
        if L != Ltmp[:len(L)]:
            # print(L)
            L_clean = [x[0] for x in L]
            L_result.append(L_clean)
        Ltmp = L

    # print('展开结果为:')
    # pprint(L_result)
    return L_result


if __name__ == '__main__':
    D = {
        (1, 1): {
            (21, 2): {(28, 3): {},
                      (29, 3): {},
                      (30, 3): {(300, 4): {(301, 5): {(302, 6): {}}}},
                      (32, 3): {(300, 4): {}}},
            (22, 2): {(33, 3): {}}}, }
    L = expand_dict(D)
    pprint(L)

运行结果:

[[(1, 1), (21, 2), (28, 3)],
 [(1, 1), (21, 2), (29, 3)],
 [(1, 1), (21, 2), (30, 3), (300, 4), (301, 5), (302, 6)],
 [(1, 1), (21, 2), (32, 3), (300, 4)],
 [(1, 1), (22, 2), (33, 3)]]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值