sumranges= [4, 4, 4, 4, 2, 2, 1, 1, 1]
amounts=[' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', '-2.5', ' 5.0', '-5.0', ' 5.0', ' 5.0', ' 25.0']
for i in range(0, len(amounts)):
amounts[i] = float(amounts[i])
newarray=[]
count=0
if sum(sumranges) == len(amounts):
for sumrange in sumranges:
start=int(sum(sumranges[0:count]))
end=int(start sumrange)
newarray.append(sum( amounts[start:end] ) )
count =1
print(newarray)
else:
print("Sum of sumranges isn't equal to length of amounts array")
結果是
[10.0, 10.0, 10.0, 10.0, 0.0, 0.0, 5.0, 5.0, 25.0]
但是,結果應該是:
[" 10.0", " 10.0", " 10.0", " 10.0", " 2.5", " 5.0", " 5.0", " 5.0", " 25.0"]
第一個 0.0 發生是因為 2.5 -2.5 的總和為 0。與第二個 0.0 類似,但這次是 5 -5。我怎樣才能洗掉-2.5,所以它是 2.5,第二個結果應該是 5。我不能只是洗掉所有的否定,因為代碼也應該適用于第二個資料:
sumranges=[4,2,2,1,1,1,1]
amounts=['-2.5', '-2.5', '-2.5', '-2.5', '-2.5', '-2.5', '-5.0', '-5.0', '-5.0', '-5.0', '-25.0', ' 99.999999999']
結果應該是:
["-10.0", "-5.0", "-10.0", "-5.0", "-5.0", "-25.0", " 99.999999999"]
uj5u.com熱心網友回復:
IIUC,你可以過濾掉你的負數:
sumranges= [4, 4, 4, 4, 2, 2, 1, 1, 1]
amounts=[' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', '-2.5', ' 5.0', '-5.0', ' 5.0', ' 5.0', ' 25.0']
out = []
start=0
for step in sumranges:
end = start step
l = list(map(float, amounts[start:end]))
if len(set(i < 0 for i in l)) > 1:
l = [i for i in l if i>0]
s = sum(l)
out.append('%s%.1f' % (' ' if s >=0 else '' , s))
start = end
out
輸出:
[' 10.0', ' 10.0', ' 10.0', ' 10.0', ' 2.5', ' 5.0', ' 5.0', ' 5.0', ' 25.0']
輸出與第二個輸入:
['-10.0', '-5.0', '-10.0', '-5.0', '-5.0', '-25.0', ' 100.0']
uj5u.com熱心網友回復:
這個答案有個問題。此代碼將為您的第二個示例(99.99999 的格式設定除外)值提供所需的結果。
如果我按照你的第一個例子應用相同的資料,它會給出你說錯誤的輸出。
您對“洗掉”負值的原因和時間的解釋尚不清楚。
因此,通過向您展示此代碼,它可能會幫助您澄清您的需求:-
def process(s, a):
assert sum(s) == len(a)
n = []
o = 0
for _s in s:
t = sum(list(map(float, a[o:o _s])))
n.append(f'{t: .2f}')
o = _s
return n
sumranges = [4, 4, 4, 4, 2, 2, 1, 1, 1]
amounts = [' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5',
' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', '-2.5', ' 5.0', '-5.0', ' 5.0', ' 5.0', ' 25.0']
print(process(sumranges, amounts))
sumranges = [4, 2, 2, 1, 1, 1, 1]
amounts = ['-2.5', '-2.5', '-2.5', '-2.5', '-2.5', '-2.5',
'-5.0', '-5.0', '-5.0', '-5.0', '-25.0', ' 99.999999999']
print(process(sumranges, amounts))
uj5u.com熱心網友回復:
您可以使用迭代器在串列推導式中形成范圍組,然后如果最大元素不是負數,則從組的總和中減去負數的總和。
這是一個可以執行此操作的函式(在適當的數值串列上):
def sumPosRanges(amounts,sumranges):
return [ sum(r)-sum(n for n in r if n<0)*(max(r)>0)
for iAmounts in [iter(amounts)] for sr in sumranges
for r in [[next(iAmounts) for _ in range(sr)]] ]
第一個輸入:
sumranges= [4, 4, 4, 4, 2, 2, 1, 1, 1]
amounts=[' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5',
' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5',
' 2.5', '-2.5', ' 5.0', '-5.0', ' 5.0', ' 5.0', ' 25.0']
sums = sumPosRanges(map(float,amounts),sumranges)
print([f"{s: 3.1f}" for s in sums])
[' 10.0', ' 10.0', ' 10.0', ' 10.0', ' 2.5', ' 5.0', ' 5.0', ' 5.0', ' 25.0']
第二個輸入:
sumranges=[4,2,2,1,1,1,1]
amounts=['-2.5', '-2.5', '-2.5', '-2.5', '-2.5', '-2.5',
'-5.0', '-5.0', '-5.0', '-5.0', '-25.0', ' 99.999999999']
sums = sumPosRanges(map(float,amounts),sumranges)
print([f"{s: 3.1f}" for s in sums])
['-10.0', '-5.0', '-10.0', '-5.0', '-5.0', '-25.0', ' 100.0']
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/328530.html
