重写功能确实在python中将复杂的字典显示为递归的(更通用)

弗拉多·波尔图斯

函数输入是一个复杂的字典:

[{'blacklist': [{'devnode': '"^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"'}, {'devnode': '"^hd[a-z][[0-9]*]"'}, {'devnode': '"^cciss!c[0-9]d[0-9]*"'}]}, {'defaults': [{'user_friendly_names': 'yes'}]}, {'defaults': [{'udev_dir': '/dev'}, {'polling_interval': '10'}, {'selector': '"round-robin 0"'}, {'path_grouping_policy': 'multibus'}, {'getuid_callout': '"/sbin/scsi_id -g -u -s /block/%n"'}, {'prio_callout': 'none'}, {'path_checker': 'readsector0'}, {'rr_min_io': '100'}, {'max_fds': '8192'}, {'rr_weight': 'priorities'}, {'failback': 'immediate'}, {'no_path_retry': 'fail'}, {'user_friendly_names': 'yes'}]}, {'blacklist': [{'wwid': '26353900f02796769'}, {'devnode': '"^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"'}, {'devnode': '"^hd[a-z]"'}]}, {'devices': [{'device': [{'vendor': '"COMPAQ "'}, {'product': '"HSV110 (C)COMPAQ"'}, {'path_grouping_policy': 'multibus'}, {'getuid_callout': '"/sbin/scsi_id -g -u -s /block/%n"'}, {'path_checker': 'readsector0'}, {'path_selector': '"round-robin 0"'}, {'hardware_handler': '"0"'}, {'failback': '15'}, {'rr_weight': 'priorities'}, {'no_path_retry': 'queue'}]}, {'device': [{'vendor': '"COMPAQ "'}, {'product': '"MSA1000 "'}, {'path_grouping_policy': 'multibus'}]}]}]

我想出了一个使它看起来像应该带有缩进的函数:

def pretty(d, indent=0):
for i in d:
    for key, value in i.items():
        print('\t' * indent + str(key) + ' {')
        if isinstance(value, list):
            for item in value:
                if isinstance(item, dict):
                    for key_1, value_1 in item.items():
                        if isinstance(value_1, list):
                            print('\t' * (indent + 2) + str(key_1) + ' {')
                            for x in value_1:
                                for key_2, value_2 in x.items():
                                    print('\t' * (indent + 3) + str(key_2) + 4 * ' ' + str(value_2))
                            print('\t' * (indent + 2) + '}')
                        else:
                            print('\t' * (indent + 1) + str(key_1) + 4 * ' ' + str(value_1))

        print('}')

它的输出效果很好:

    blacklist {
    devnode    "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
    devnode    "^hd[a-z][[0-9]*]"
    devnode    "^cciss!c[0-9]d[0-9]*"
}
defaults {
    user_friendly_names    yes
}
defaults {
    udev_dir    /dev
    polling_interval    10
    selector    "round-robin 0"
    path_grouping_policy    multibus
    getuid_callout    "/sbin/scsi_id -g -u -s /block/%n"
    prio_callout    none
    path_checker    readsector0
    rr_min_io    100
    max_fds    8192
    rr_weight    priorities
    failback    immediate
    no_path_retry    fail
    user_friendly_names    yes
}
blacklist {
    wwid    26353900f02796769
    devnode    "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
    devnode    "^hd[a-z]"
}
devices {
        device {
            vendor    "COMPAQ "
            product    "HSV110 (C)COMPAQ"
            path_grouping_policy    multibus
            getuid_callout    "/sbin/scsi_id -g -u -s /block/%n"
            path_checker    readsector0
            path_selector    "round-robin 0"
            hardware_handler    "0"
            failback    15
            rr_weight    priorities
            no_path_retry    queue
        }
        device {
            vendor    "COMPAQ "
            product    "MSA1000 "
            path_grouping_policy    multibus
        }
}

但是我的功能只会深入“两层”,如果存在类似设备{device {item {}}}这样的东西,该如何使该功能更通用呢?

科尔坦

递归!

您需要编写函数以使其可以调用自身:

INDENT_STEP = 4


def print_indented(indent, *args, **kwargs):
    """
    Prints anything with `indent` spaces before it.
    Passes arguments to builtin print.
    """
    print((" " * indent), *args, **kwargs)


def print_list(items, indent):
    print("{")
    for value in items:
        print_formatted(value, indent)
    print_indented(indent, "}")


def print_dict(dictionary, indent):
    """Prints each key and value of a dictionary, separated by a space."""
    for key, value in dictionary.items():
        child_indent = indent + INDENT_STEP
        print_indented(child_indent, key, "", end="")
        print_formatted(value, child_indent)


def print_formatted(item, indent=0):
    if isinstance(item, list):
        print_list(item, indent)
        return

    if isinstance(item, dict):
        print_dict(item, indent)
        return

    print(item)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

确实在Laravel中将HTTP强制为https

来自分类Dev

从根本上说函数调用有问题。功能确实在控制台中起作用

来自分类Dev

在复杂的Select语句中将列显示为行-SQL

来自分类Dev

字符串==重载运算符是否确实在某些通用比较方法中使用?

来自分类Dev

在Swift中为我的功能实现更通用的方法

来自分类Dev

在python中将csv文件重写为新文件

来自分类Dev

在python中遍历复杂字典的更简单方法?

来自分类Dev

Swift更复杂的数组字典

来自分类Dev

setMainFrameURL是否确实在webView中定义

来自分类Dev

Python字典递归

来自分类Dev

如何在python中将嵌套列表展平为字典?

来自分类Dev

在python中将对象解析为json或字典

来自分类Dev

这是链表中递归搜索功能的正确实现吗?

来自分类Dev

将ActiveRecord查询重写为递归SQL

来自分类Dev

Tricky ::将函数重写为尾递归

来自分类Dev

如何将循环重写为递归

来自分类Dev

如何将函数重写为递归

来自分类Dev

如何在angularjs中将对象显示为复杂的html表

来自分类Dev

将此字典重写为字面量

来自分类Dev

C#通用字典功能

来自分类Dev

Python从复杂字典创建子字典

来自分类Dev

在JUnit中将“ assertTrue”重写为“ assertThat”?

来自分类Dev

Python:如何将嵌套字典打印为具有可变行的复杂表?

来自分类Dev

如何在PHP中为大型多维JSON文件编写递归的foreach显示功能

来自分类Dev

递归嵌套字典的Python方式

来自分类Dev

python中的递归字典修改

来自分类Dev

递归字典在python中行走

来自分类Dev

为通用递归程序生成递归树的程序

来自分类Dev

Django确实在img src(template)中识别变量

Related 相关文章

热门标签

归档