[英]How to implement a nested for loop in functional programming in python?
我在考慮兩次應用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)
您還可以考慮使用列表推導或生成器表達式(取決於您是否需要延遲生成結果(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
,它生成的是最里面的值的平方,所以您得到的所有值的一個長序列都是平方的,而行之間沒有區別。 映射就是這樣工作的,它為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>)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.