我在考虑两次应用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循环,那么我将像上面一样处理它。因此,我试图实现双重地图,但我不知道该如何构造。任何帮助,将不胜感激!
您正在对内部列表求和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)
另外您也可以产生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
替代方法,该方法产生的是最里面的值的平方,因此您得到所有值的一个长序列,平方,不区分行。这就是映射的工作方式,它为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] 删除。
我来说两句