簡體   English   中英

如何在python的函數式編程中實現嵌套的for循環?

[英]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() ij成為笛卡爾積 但是,您需要將整數元組傳遞給可調用的映射:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM