簡體   English   中英

在列表理解中保持總和?

[英]mantain a sum in list comprehension?

這是我的代碼

def width2colspec(widths):
    tupleback = []
    a=0
    for w in widths:
        b=a+w
        tupleback.append((a,a+w))
        a=b
    return tupleback

例如:

widths=[15,9,50,10]
width2colspec(widths)

結果:

[(0, 15), (15, 24), (24, 74), (74,84)]

(第一個必須是零)

它可以正常工作(也許不是很優雅)

為了練習,我試圖將它轉換為一個列表理解一個班輪,但我無法讓它工作,我得到的最接近的是這個。

widths=[15,9,50,10]
colspecs=list((widths[i],widths[i]+widths[i+1]) for i in range(len(widths)-1))

結果:

[(0, 15), (15, 24), (9, 59), (50,60)]

(它沒有通過循環保持總和)

所以我的問題是,有可能嗎?

如果您使用的是 Python 3.8 或更高版本,則可以使用賦值表達式(利用海象運算符:= )在單個列表推導中執行此操作。 我通過默認參數初始化last有點“作弊”,但這並不是絕對必要的(我只是想讓它成為“單線”)。

def width2colspec(widths, last=0):
   return [(last, last := last+width) for width in widths]

老實說,我不覺得這混亂。

可以將其作為純粹的列表理解來執行,但它涉及大量重新計算,因此我不建議實際這樣做。

首先構建所有總和的列表(請注意,這是一遍又一遍地重新對相同的數字求和,因此它的效率低於保持運行總和的原始代碼):

>>> [sum(widths[:i]) for i in range(len(widths)+1)]
[0, 15, 24, 74, 84]

然后對其進行迭代以生成您的元組列表:

>>> [tuple([sum(widths[:i]) for i in range(len(widths)+1)][i:i+2]) for i in range(len(widths))]
[(0, 15), (15, 24), (24, 74), (74, 84)]

請注意,我們現在再次重新計算所有這些總和因為我們沒有將原始列表分配給變量。

暫無
暫無

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

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