如何在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
生产j
和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
,所以你得到一个长序列的所有值,平方,没有区别行。这就是映射的工作原理,它为输入中处理的每个项目生成一个值。
你也可以嵌套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循环?的主要内容,如果未能解决你的问题,请参考以下文章