[英]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.