我正在考虑将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)
如果它是一个单循环,那么我会像上面那样接近它。所以我试图实现双重映射,但我不知道如何构建它。 任何帮助将不胜感激!
答案 0 :(得分:3)
您正在对内部列表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)
您可以使用itertools.product()
生成i
和j
作为笛卡儿产品;但是,你将整数的元组传递给可调用的地图:
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; 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>)
。