gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:24:58 24 4
gpt4 key购买 nike

我正在考虑应用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com