第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Python - 迭代嵌套對象

Python - 迭代嵌套對象

qq_遁去的一_1 2022-12-20 12:05:08
在 Python 中迭代嵌套對象的優(yōu)雅方法是什么?我目前正在使用如下的嵌套循環(huán)。for job in jobs:    for task in job.tasks:        for command in task.commands:            print command.actual_cmd有沒有更好的方法更Pythonic?
查看完整描述

2 回答

?
慕神8447489

TA貢獻1780條經(jīng)驗 獲得超1個贊

您可以設(shè)置鏈式生成器以降低縮進級別。


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的觀點,在三個嵌套循環(huán)的情況下,鏈接生成器在可讀性方面可能不會給你帶來太多好處。


如果您的嵌套邏輯比這更深,生成器就會開始變得有吸引力。不僅縮進級別受到控制,您還可以為每個生成器分配一個有意義的變量名稱,有效地為for循環(huán)命名。


查看完整回答
反對 回復(fù) 2022-12-20
?
楊__羊羊

TA貢獻1943條經(jīng)驗 獲得超7個贊

它是蟒蛇式的。已經(jīng)。


但是如果你擔(dān)心這會深入 10 層以上,只有最內(nèi)層的循環(huán)有任何有趣的東西,你可以考慮的一件事是創(chuàng)建一個生成器。你的代碼可以變成:


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 多個層次,你也不用擔(dān)心:


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。它只是避免過度縮進。


查看完整回答
反對 回復(fù) 2022-12-20
  • 2 回答
  • 0 關(guān)注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號