在Python 3.x中聚合没有嵌套循环的嵌套列表

时间:2016-05-02 18:06:54

标签: python python-3.x lambda

我即将开始使用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的实例,其中有多个CoursesResources作为我的起点。

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适合这样的东西吗? 对于像这样的手术来说,最蟒蛇的方式是什么?

2 个答案:

答案 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]