Python - 迭代嵌套对象

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


for job in jobs:

    for task in job.tasks:

        for command in task.commands:

            print command.actual_cmd

有没有更好的方法更Pythonic?


qq_遁去的一_1
浏览 159回答 2
2回答

慕神8447489

您可以设置链式生成器以降低缩进级别。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循环命名。

杨__羊羊

它是蟒蛇式的。已经。但是如果你担心这会深入 10 层以上,只有最内层的循环有任何有趣的东西,你可以考虑的一件事是创建一个生成器。你的代码可以变成:def get_command(jobs):    for job in jobs:        for task in job.tasks:            for command in task.commands:                yield commandfor 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 yfor command in get_nested(jobs, ["tasks", "commands"]):    print command.actual_cmd但是不,这种概括并没有使它更加pythonic。它只是避免过度缩进。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python