首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -迭代嵌套对象

Python -迭代嵌套对象
EN

Stack Overflow用户
提问于 2020-06-02 05:06:31
回答 2查看 341关注 0票数 3

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

代码语言:javascript
复制
for job in jobs:
    for task in job.tasks:
        for command in task.commands:
            print command.actual_cmd

有没有更好的方法,更多的毕达通?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-02 05:17:13

您可以设置链式生成器以保持缩进水平。

代码语言:javascript
复制
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循环一个名称。

票数 3
EN

Stack Overflow用户

发布于 2020-06-02 05:33:40

。已经开始了。

但是,如果您担心这会深入到10+级别,因为只有最内部的循环有什么有趣的地方,那么您可以考虑的一件事是创建一个生成器。您的代码可以变成:

代码语言:javascript
复制
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+级别的深度,也不用担心:

代码语言:javascript
复制
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

但是不,这一概括并不能使它更多的是仿生的。它只会避免过多的压痕。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62145216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档