簡體   English   中英

保持百分比列表的算法加起來達到100%

[英]Algorithm to keep a list of percentages to add up to 100%

(代碼示例是python)
讓我們假設我們有一個百分比列表,總計100:

mylist = [2.0, 7.0, 12.0, 35.0, 21.0, 23.0]  

某些mylist值可能會更改,其他值必須保持固定。
讓我們假設前3(2.0,7.0,12.0)必須保持固定,最后3(35.0,21.0,23.0)可能會改變。

fix = mylist[:3]
vari = mylist[3:]

目標是將新項添加到mylist,而sum(mylist)保持100.0和vari
物品保持彼此的關系。 為此,我們需要減去一個CERTAIN
每個變量項的PERCENTAGE。 示例:假設我們要將4.0添加到mylist。
使用丑陋的aproximation循環我發現我需要減去ca. 5.0634%
每個變量項目(CERTAIN PERCENTAGE = 5.0634):

adjusted =[]
for number in vari:
    adjusted.append(number-(number*(5.0634/100.0)))
adjusted.extend(fix)
adjusted.append(4.0)

現在調整包含我想要的結果。

我的問題是如何計算某些百分比;。)

這個怎么樣?

def adjustAppend( v, n ):
    weight= -n/sum(v)
    return [ i+i*weight for i in v ] + [n]

給定一個數字列表v ,附加一個新數字, n 對現有數字進行加權以保持總和相同。

 sum(v) == sum( v + [n] )

vi的每個元素必須通過iri )的某個函數來減少

sum(r(i)) == -n

要么

sum( map( r, v ) ) == -n

因此,加權函數是-(n*i)/sum(v)

你很傻。

假設您要將4.0添加到列表中。 您不需要從每個中減去一定數量。 你需要做的是將每個項目相乘。

100 - 4 = 96.因此,將每個項目乘以0.96

你想添加20.0作為項目。 那么你將每個項目乘以0.8,即(100-20)* 0.01

更新:Hrmn我沒有仔細閱讀。

想到這就是這樣。 (固定)+(vari)= 100; (固定)+(vari * x)+ newitem = 100;

所以基本上就像我們之前做的那樣,只有vari部分。 如果vari總計為50,並且您要添加的新項目為3.0,則將vari中的每個項目乘以(47/50)

new_item = 4.0
CERTAIN_PERCENTAGE = 100 * (float(new_item) / sum(vari)) 
NEW_NUMBER = 4.0

mylist = [2.0, 7.0, 12.0, 35.0, 21.0, 23.0]
fix = mylist[:3]
vari = mylist[3:]

weight = (100 - sum(fix) - NEW_NUMBER)/sum(vari)

adjusted = []
adjusted.extend( (weight*v for v in vari) )
adjusted.extend(fix)
adjusted.append(NEW_NUMBER)

print sum(adjusted)                # 100.0

編輯:Triptych是對的,如果你真的對某個百分比感興趣,下面的代碼就是這樣的:

certain_percentage = 100 * NEW_NUMBER / sum(vari)
print certain_percentage        # 5.06329113924

我認為你的常量5.0634實際上應該是5.0633。

暫無
暫無

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

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