我即将开始使用python的3.5 lambda表示法,我想知道嵌套循环可以简单地用lambda one-liner代替。 例如。: 我有这个简单的虚拟类层次结构:
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()
我有一个College
的实例,其中有多个Courses
和Resources
作为我的起点。
college = College()
现在,如果我想要list
Resources
College
for-loops
,我可以轻松地使用2 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
yum install java-1.7.0-oracle-1.7.0.101-1jpp.1.el7.x86_64
,这是我想要实现的目标。 lambda适合这样的东西吗?
对于像这样的手术来说,最蟒蛇的方式是什么?
答案 0 :(得分:6)
首先,请通过调用list()
来停止创建空列表 - 使用文字空列表[]
更简单快捷(如果不这样做,请将此标记为timeit
相信我。)
其次,绝对不需要使用lambda
来创建所需的列表。一个简单的列表理解将完成这项工作:
all_resources = [r for r in course.resources for course in college.courses]
不要过度思考它。保持尽可能简单。
答案 1 :(得分:2)
你不应该为此使用lambdas。你应该是列表推导。
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]