簡體   English   中英

匯總的Python列表理解

[英]Python List Comprehension with Sum

我有一些看起來像這樣的python代碼:

mat = [[3], [4], [4], [0], [1, 2]]
nwalls = 5*[1]
for i in range(1,3):
    nwalls = [sum(nwalls[k] for k in mat[j]) for j in range(5)]
# nwalls = [1, 2, 2, 1, 2]

我無法一生都在不使用列表理解的情況下將其展開為語法。 請協助。

直接翻譯將是

mat = [[3], [4], [4], [0], [1, 2]]
nwalls = 5*[1]
for i in range(1, 3):
    _nwalls = []
    for j in range(5):
        tot = 0                # - sum
        for k in mat[j]:       #  /
            tot += nwalls[k]   # /
        _nwalls.append(tot)
    nwalls = _nwalls

(nwalls[k] for k in mat[j])它本身是一個生成器,在python repl中,您可以將其檢查為:

>>> y = (x for x in range(10))
>>> type(y)
<class 'generator'>

sum可以使用一個生成器,如sum( (x for x in range(10)) )PEP289表示

如果函數調用具有單個位置參數,則它可以是不帶括號的生成器表達式,但是在所有其他情況下,都必須將其括在括號中。

所以它看起來像sum(x for x in range(10))

不必每次都重新創建nwalls列表,只需為列表中的特定插槽分配一個新值,而只需在列表中保留以前的值,這樣您就不會最終使用循環中先前生成的值:

mat = [[3], [4], [4], [0], [1, 2]]
nwalls = 5*[1]
prev_nwalls = 5*[1]
for _ in range(1,3):
    for j in range(5):
        nwalls[j] = sum(prev_nwalls[k] for k in mat[j])
    prev_nwalls[:] = nwalls

assert nwalls == [1, 2, 2, 1, 2]

如果您想完全避免理解,請首先知道等價於內置sum的python如下所示:

def sum(iterable):
    s = 0
    for n in iterable:
        s+=n
    return s

因此,將行nwalls[j] = sum(prev_nwalls[k] for k in mat[j])替換為:

s = 0
for k in mat[j]:
    s+=nwalls[k]
nwalls[j] = s

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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