2009-01-05 127 views
4

(代碼示例是蟒蛇)
讓我們假設我們有一個爲100百分比的列表:算法保持百分比清單,加起來爲100%

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

MYLIST的某些值可能被改變,其他人必須保持固定。
假設前3個(2.0,7.0,12.0)必須保持固定,最後三個(35.0,21.0,23.0)可以更改。

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

的目標是增加一個新項目MYLIST,而總和(MYLIST)保持100.0和瓦里
項目保持自己的關係給對方。爲此,我們需要減去每個可變項目的一定百分比
百分比。例如:假設我們想將4.0添加到mylist。
使用醜陋的aproximation循環我發現我需要減去ca. 5.0634%
每個VARI項(一定比例= 5.0634)的:

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

調整現在包含我期望的結果。

我的問題是如何計算某個PERCENTAGE;。)

+0

就像一個快速的問題,你是否將任何附加值視爲進入「修復」集或「vari」集,例如。你能改變你添加的任何值嗎? – chillysapien 2009-01-05 12:27:00

+0

在追加到列表的過程中,要添加的值正在修復。它在mylist中的角色可能是修復或vari進一步操作。 – Titusz 2009-01-05 12:53:51

回答

9

這是怎麼回事?

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

給出的數字v的列表,添加一個新的號碼,ñ。 加權現有數字以保持總和相同。

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

v,中的每一個元件,必須通過的一些功能降低,- [R),使得

sum(r(i)) == -n 

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

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

3

你是愚蠢的。

假設您想將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)

+0

100 - 4 = 94? 96? ;) – 2009-01-05 12:30:58

+0

他也不能減去。技術雖然很好。 – 2009-01-05 12:34:50

1
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 

編輯:三聯是正確的, 如果你是在一定比例真正感興趣,下面的代碼去爲它:

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

我想你的常數5.0634實際上應該是5.0633。

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