如何在python中实现函数式编程中的嵌套for循环?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在python中实现函数式编程中的嵌套for循环?相关的知识,希望对你有一定的参考价值。

我正在考虑应用map函数两次,以便它可以作为一个双循环,但我不知道这是否有意义。那是怎么回事呢?

例如,这就是我正在做的事情:

当务之急:

def degree(A):
    n = len(A)
    t = []
    for i in range(n):
        d = 0
        for j in range(n):
            d+=A[i][j]
        t.append(d)

    return t

功能:

def degree(A):
    n = len(A)
    t = []
    map(lambda x,y:x+y,A)

如果它是一个单循环,那么我会像上面那样接近它。所以我试图实现双重映射,但我不知道如何构建它。任何帮助,将不胜感激!

答案

你正在总结内部列表A,所以只需将sum应用于A中的每个嵌套列表:

def degree(A):
    return map(sum, A)

您还可以考虑使用列表推导或生成器表达式(取决于您是否需要延迟生成结果(Python 2中的map()生成列表,在Python 3中它可以懒惰地工作):

def degree(A):
    # returns a list
    return [sum(row) for row in A]

def degree(A):
    # returns a generator
    return (sum(row) for row in A)

你可以使用i生产jitertools.product()作为笛卡儿产品;但是,你要将一个整数元组传递给地图可调用:

from itertools import product

map(lambda ij: A[ij[0]][ij[1]] ** 2, product(range(len(A)), 2))

这可以通过使用itertools.starmap()来解决:

from itertools import product, starmap

starmap(lambda i, j: A[i][i] ** 2, product(range(len(A)), 2))

两者都没有产生;我演示了一个生成最内层值的平方的lambda,所以你得到一个长序列的所有值,平方,没有区别行。这就是映射的工作原理,它为输入中处理的每个项目生成一个值。

你也可以嵌套map()电话;把内部map()放在外部map()的callable中:

map(lambda r: map(lambda v: v ** 2, r), A)

但请注意,这会在Python 3中生成一系列懒惰对象。同样,求和在这种情况下没有意义,因为没有积累的结果。

对于序列中结果的一般累积,您想要使用functools.reduce() function; callable在运行结果和序列中的下一个值上应用callable。您可以使用lambda x, y: x + y函数和map()生成一个总和:

map(lambda r: reduce(lambda x, y: x + y, r, 0), A)

但是对于刚刚总结,reduce(lambda x, y: x + y, <iterable>, 0)语法只是一种冗长而缓慢的拼写sum(<iterable>)的方式。

以上是关于如何在python中实现函数式编程中的嵌套for循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 cuda 推力中实现嵌套循环

Python中的闭包

高阶函数式编程二:在 Kotlin 中实现单位半群(Monoid)

如何在auto lisp中实现嵌套函数

Python循环语句

如何在 Javascript 中实现 Haskell 的 FRP Behavior 类型?