簡體   English   中英

在Python 3.x中聚合嵌套列表而沒有嵌套循環

[英]Aggregate nested lists without nested loops in Python 3.x

我將以python 3.5的lambda表示法工作,我想知道嵌套嵌套的循環是否可以簡單地用lambda一線替換。 例如:我有這個簡單的虛擬類層次結構:

class Resource:
    def __init__(self, name="foo"):
        self.name = name

class Course:
    def __init__(self):
        self.resources = list()

class College:
    def __init__(self):
        self.courses = list()

我有一個以多個CoursesResources為起點的College實例。

college = College()

現在,如果我想獲取我College中所有Resourceslist ,則可以使用2個for-loops輕松地做到這一點:

all_resources = list()
for course in  college.courses:
    for resource in course.resources:
        all_resources.append(resource)

這確實非常簡單,但是我想知道是否也可以通過執行以下操作來實現此目的:

all_resources = list(map(lambda r: r, [c.resources for c in college.courses]))

但不幸的是這給了我一個listlists ,而不是一個listResources ,我想實現。 lambda是否適合類似這樣的事情? 像這樣的操作最Python化的方式是什么?

首先,請停止通過調用list()創建空列表-使用文字空列表[]既簡單又快捷(如果您不相信我,請使用timeit進行檢查)。

其次,絕對不需要使用lambda創建所需的列表。 一個簡單的列表理解就可以了:

all_resources = [r for r in course.resources for course in college.courses]

不要想太多。 盡可能保持簡單。

您不應該為此使用lambda。 您應該是列表理解者。

all_resources = [resource for resource for course in college.courses in course.resources]

Lambda在這里是完全沒有必要的。 如果您絕對想要,可以執行以下操作:

all_resources = []
[(lambda c: [all_resources.append(r) for r in c])(x) for x in college.courses)]

但我建議第一個。 給出不同順序的替代方案是

all_resources = [resource for resource in course.resources for course in college.courses]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM