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

ce1

我在考虑两次应用map函数,以使其充当double for循环,但是我不知道这是否有意义。那是解决的办法吗?

例如,这就是我正在从事的工作:

当务之急:

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)

如果它是单个for循环,那么我将像上面一样处理它。因此,我试图实现双重地图,但我不知道该如何构造。任何帮助,将不胜感激!

马丁·彼得斯(Martijn Pieters)

您正在对内部列表求和A,因此只需将其应用于sum每个嵌套列表中A

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

您还可以考虑使用列表推导或生成器表达式(取决于您是否需要延迟生成结果(map()在Python 2中生成列表,在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)

另外您也可以产生ij作为一个笛卡尔乘积,使用itertools.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替代方法,该方法产生的是最里面的值的平方,因此您得到所有​​值的一个长序列,平方,不区分行。这就是映射的工作方式,它为input中处理的每个项目产生一个值

你也只是能map()电话; 将内部map()变量放在外部的可调用对象中map()

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

但是请注意,这随后在Python 3中产生了一个惰性对象的惰性序列。同样,在这种情况下,求和没有意义,因为没有结果的累积。

要获得整个序列中结果的一般累积,您需要使用functools.reduce()函数可调用对象将可调用对象应用于运行结果和序列中的下一个值。您可以使用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>)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章