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

标签 python loops functional-programming

我正在考虑应用 map 函数两次,以允许它充当双 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 循环,那么我会像上面那样处理它。所以我试图实现一个双映射,但我不知道如何构造它。 任何帮助将不胜感激!

最佳答案

您正在对内部列表求和 A , 所以只需申请 sumA 中的每个嵌套列表:

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() ;但是,您会将整数的元组传递给可调用 map :

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() :

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

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

对于序列中结果的一般累积,您需要使用 functools.reduce() function ; that 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 - 如何在python函数式编程中实现嵌套for循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47850124/

相关文章:

haskell - Haskell 中的动态调度

haskell - 类型别名混淆的 RankNTypes

python - Selenium - 如何在 X Y 位置上找到 Canvas 上像素的颜色?

python - 如何在对象的属性(也是对象)属性发生变化时自动调用对象的方法?

c# - 使用 LINQ 按类型合并序列

python为scipy中的约束动态创建字典

python - 使用隐式类型转换实现逐点算术

python - 将 '10yrs 5mon' 分类值转换为月份

python - 在函数之间使用用户输入时遇到问题

PHP 产品数据库中的三列表