[英]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.