为了账号安全,请及时绑定邮箱和手机立即绑定

Python - 迭代嵌套对象

Python - 迭代嵌套对象

qq_遁去的一_1 2022-12-20 12:05:08
在 Python 中迭代嵌套对象的优雅方法是什么?我目前正在使用如下的嵌套循环。for job in jobs:    for task in job.tasks:        for command in task.commands:            print command.actual_cmd有没有更好的方法更Pythonic?
查看完整描述

2 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

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


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循环命名。


查看完整回答
反对 回复 2022-12-20
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

它是蟒蛇式的。已经。


但是如果你担心这会深入 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。它只是避免过度缩进。


查看完整回答
反对 回复 2022-12-20
  • 2 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信