如何在python函数式编程中实现嵌套for循环?
我曾考虑过两次应用map函数,以便让它充当double for循环,但我不知道这是否有意义。 这就是解决问题的方法吗 例如,这就是我正在进行的工作: 当务之急是:如何在python函数式编程中实现嵌套for循环?,python,loops,functional-programming,Python,Loops,Functional Programming,我曾考虑过两次应用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 = []
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
求和,因此只需对A
中的每个嵌套列表应用sum
:
def degree(A):
return map(sum, A)
您还可以考虑使用列表理解或生成器表达式(取决于您是否需要在Python 2中懒洋洋地产生结果(<代码> MAP())/代码>,生成一个列表,在Python 3中它懒洋洋地工作):
否则,您可以使用生成作为笛卡尔积的i
和j
;但是,您将向可调用的映射传递一个整数元组:
from itertools import product
map(lambda ij: A[ij[0]][ij[1]] ** 2, product(range(len(A)), 2))
这可以通过使用以下方法来解决:
两者都不产生求和;我演示了一个生成最里面值的平方的lambda
,这样就得到了一个长序列的所有值,平方,而不区分行。这就是映射的工作原理,它在输入中处理的每个项都产生一个值
您还可以嵌套map()
调用;将内部map()
放入外部map()的可调用项中:
但请注意,这会在Python3中生成一个惰性对象的惰性序列。同样,在这种情况下,求和没有意义,因为没有结果的累积
对于跨序列的结果的一般累积,您希望使用;that callable对正在运行的结果和序列中的下一个值应用callable。您可以使用lambda x,y:x+y
函数和map()
:
但是对于简单的求和来说,reduce(lambda x,y:x+y,0)
语法只是一种冗长而缓慢的拼写方法sum()
您所做的不仅仅是有一个双循环,还可以在内部循环中创建一个和。使用map(sum,a)可以获得同样的效果
,顺便说一句,不需要嵌套任何东西。您尝试map()
在您的上下文中没有任何意义;您想到reduce()
也许?map()
会将任意数量的iterable作为输入,并将它们一起应用,但是map(…,A)
只有一个输入,因此lambda只有一个参数。然后构建一个结果序列,而不是一个总和。reduce()
通过对函数和输入序列的重复调用生成一个结果。因此我想知道这将如何处理a[I][j]第二部分,由双循环构成的矩阵?这两种方法都是等价的吗?@ce1:两种方法都是什么?不,product()
方法不会产生相同的结果;当你重置d
外循环的每次迭代时,你不能用product()
产生相同的结果。如果行是d+=A[i][j]*X[j]如果X是传递给函数的列表,那么map(sum,a)在函数编程中会如何变化?@ce1:使用zip()
将a
中的行与X
中的行配对:(sum(a*X代表a,zip中的X代表a中的r,X)在生成器表达式中,或从操作符导入mul
中,然后映射(lambda:sum(map(prod,r,X)),A)
如果必须在理解上使用map()
。
from itertools import product
map(lambda ij: A[ij[0]][ij[1]] ** 2, product(range(len(A)), 2))
from itertools import product, starmap
starmap(lambda i, j: A[i][i] ** 2, product(range(len(A)), 2))
map(lambda r: map(lambda v: v ** 2, r), A)
map(lambda r: reduce(lambda x, y: x + y, r, 0), A)