亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號