繁体   English   中英

Python - 迭代嵌套对象

[英]Python - Iterating over nested objects

在 Python 中迭代嵌套的 object 的优雅方法是什么? 我目前正在使用嵌套循环,如下所示。

for job in jobs:
    for task in job.tasks:
        for command in task.commands:
            print command.actual_cmd

有没有更好的方法更 Pythonic?

您可以设置链式生成器以降低缩进级别。

iter_tasks = (task for job in jobs for task in job.tasks)
iter_commands = (command for task in iter_tasks for command in task.commands)

for command in iter_commands:
    print(command.actual_cmd)

我同意OldBunny2800的观点,在三个嵌套循环链接生成器的情况下,在可读性方面可能不会给您带来太多好处。

如果你的嵌套逻辑比这更深,生成器就会开始变得有吸引力。 不仅可以检查缩进级别,还可以为每个生成器分配一个有意义的变量名,从而有效地为for循环命名。

它是 pythonic 已经。

但是如果你担心这会超过 10 层以上,只有最里面的循环有什么有趣的东西,你可以考虑的一件事是创建一个生成器。 你的代码可以变成:

def get_command(jobs):
    for job in jobs:
        for task in job.tasks:
            for command in task.commands:
                yield command

for command in get_command(jobs):
    print command.actual_cmd

所以整个目的是避免过度缩进。

为了使其适用于多个级别,因此即使它有 100 多个级别,您也不必担心:

def get_nested(objlist, attribs):
    for x in objlist:
        if len(attribs) == 0:
            yield x
        else:
            x_dot_attr = getattr(x, attribs[0])
            for y in get_nested(x_dot_attr, attribs[1:]):
                yield y

for command in get_nested(jobs, ["tasks", "commands"]):
    print command.actual_cmd

但是不,这种概括并没有使它更pythonic。 它只是避免过度缩进。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM