[英]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()
我有一個以多個Courses
和Resources
為起點的College
實例。
college = College()
現在,如果我想獲取我College
中所有Resources
的list
,則可以使用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]))
但不幸的是這給了我一個list
的lists
,而不是一個list
的Resources
,我想實現。 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.