保持百分比列表的算法加起来达到100%

时间:2009-01-05 12:18:10

标签: python algorithm

(代码示例是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
物品保持彼此的关系。为此,我们需要减去一个人 每个变量项的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)

现在调整包含我想要的结果。

我的问题是如何计算某些百分比;。)

4 个答案:

答案 0 :(得分:9)

这是怎么回事?

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

给定一个数字列表 v ,附加一个新数字 n 。 对现有数字进行加权以保持总和相同。

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

v i 的每个元素必须通过 i r (< em> i )这样

sum(r(i)) == -n

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

因此,加权函数为-(n*i)/sum(v)

答案 1 :(得分: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)

答案 2 :(得分:2)

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

答案 3 :(得分: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。