【问题标题】:flatMap or bind in Python 3?Python 3 中的 flatMap 或绑定?
【发布时间】:2014-02-20 12:41:44
【问题描述】:

Python 提供了提供映射/过滤类型功能的列表推导。我可以用这个做一个 flatMap aka 绑定操作吗?我见过使用 itertools 或其他附加库的解决方案。我可以用核心 Python 做到这一点吗?

# this
[[x,10*x] for x in [1,2,3]]
# will result in unflattened [[1, 10], [2, 20], [3, 30]]

【问题讨论】:

  • itertools 包含在标准库中,因此根据定义它是“核心 Python”。
  • @adsmith:不,根据定义,它是“Python 标准库”。 OP 的含义是作为一种语言功能,例如 mapfilter 的列表理解语法
  • "or other add-on libraries" 表明 OP 可能没有意识到 itertools 是 Python 的一部分。
  • 只是因为我不想为了纯粹的学术目的而重新发明轮子,itertools 的解决方案是什么?

标签: python functional-programming


【解决方案1】:
[y for x in [1, 2, 3] for y in [x, 10*x]]

只需在列表推导中添加另一个 for

【讨论】:

  • 为了澄清——列表组合的编写顺序与您编写 for 循环的顺序相同。首先你会做:for x in [1,2,3]: 然后缩进并做for y in [x,10*x]:,然后yield y 或任何你喜欢的。对我来说,这仍然感觉像是倒序排列(for y in [x, 10*x] for x in [1,2,3] 从左到右对我来说更有意义),但你有它。
  • @adsmith:如果您使用 if 添加过滤,从右到左的变体会变得很尴尬
  • 哦,不管怎样,这都是有道理的,每当我看到这样的“嵌套”列表推导时,我只需要侧身转动大脑就可以看到 for 循环。
  • 行得通。这种语法似乎不合逻辑。非嵌套的理解在右侧具有源,在左侧具有产生的值。这种嵌套以相反的顺序工作,没有明显的逻辑。不管优雅如何,它现在都可以。
【解决方案2】:

python list comprehensions; compressing a list of lists?

from functools import reduce
def flatMap(array: List[List]): List
    return reduce(list.__add__, array)
    # or return reduce(lambda a,b: a+b, array)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 2016-12-31
    • 2017-05-15
    • 2011-04-14
    • 2013-01-15
    • 1970-01-01
    • 2014-09-10
    • 2011-04-18
    相关资源
    最近更新 更多