Алгоритм ведения списка процентов для добавления до 100% - PullRequest
4 голосов
/ 05 января 2009

(примеры кода - python)
Предположим, у нас есть список процентов, которые в сумме составляют 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 и варьируется
предметы сохраняют свои отношения друг с другом. Для этого нам нужно вычесть ОПРЕДЕЛЕННЫЙ
PERCENTAGE от каждого варианта. Пример: предположим, что мы хотим добавить 4.0 в мой список.
Используя уродливый цикл приближения, я обнаружил, что мне нужно вычесть ок. 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 ]

9 голосов
/ 05 января 2009

Как это?

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 ( i *) 1020 *) такой, что

sum(r(i)) == -n

или

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

Следовательно, весовая функция равна -(n*i)/sum(v)

3 голосов
/ 05 января 2009

ты глупый.

Допустим, вы хотите добавить 4.0 в список. Вам не нужно вычитать определенную сумму из каждого. Что вам нужно сделать, это умножить каждый элемент.

100 - 4 = 96. следовательно, умножьте каждый элемент на 0,96

Вы хотите добавить 20.0 в качестве предмета. тогда вы умножаете каждый элемент на 0,8, что составляет (100-20) * 0,01

обновление: хммм, я недостаточно внимательно прочитал.

думай об этом так. (фиксированный) + (вари) = 100; (исправлено) + (переменная * x) + newitem = 100;

так что, в основном, то, что мы делали раньше, за исключением только части переменной. если переменная равна 50, а добавляемый вами новый элемент равен 3,0, то умножьте каждый элемент в переменной на (47/50)

2 голосов
/ 05 января 2009
new_item = 4.0
CERTAIN_PERCENTAGE = 100 * (float(new_item) / sum(vari)) 
1 голос
/ 05 января 2009
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...