繁体   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