【问题标题】:Aggregate nested lists without nested loops in Python 3.x在 Python 3.x 中聚合没有嵌套循环的嵌套列表
【发布时间】:2016-05-02 18:06:53
【问题描述】:

我即将进入 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()

我有一个College 的实例,其中有多个CoursesResources 作为我的起点。

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]))

但不幸的是,这给了我一个 listof lists 而不是 listof Resources,这是我想要实现的。 lambda 适合这样的事情吗? 对于这样的操作,最 Pythonic 的方式是什么?

【问题讨论】:

    标签: python python-3.x lambda


    【解决方案1】:

    首先,请通过调用 list() 停止创建空列表 - 使用文字空列表 [] 既简单又快捷(如果您不相信我,请查看 timeit)。

    其次,绝对不需要使用lambda 来创建您想要的列表。一个简单的列表理解就可以完成这项工作:

    all_resources = [r for r in course.resources for course in college.courses]
    

    不要想太多。尽量保持简单。

    【讨论】:

      【解决方案2】:

      您不应该为此使用 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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        • 1970-01-01
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        相关资源
        最近更新 更多