在Python中迭代嵌套对象的优雅方法是什么?我目前正在使用嵌套循环,如下所示。
for job in jobs:
for task in job.tasks:
for command in task.commands:
print command.actual_cmd有没有更好的方法,更多的毕达通?
发布于 2020-06-02 05:17:13
您可以设置链式生成器以保持缩进水平。
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循环一个名称。
发布于 2020-06-02 05:33:40
是。已经开始了。
但是,如果您担心这会深入到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但是不,这一概括并不能使它更多的是仿生的。它只会避免过多的压痕。
https://stackoverflow.com/questions/62145216
复制相似问题