В Python У меня есть словарь значений с суммой 1.0.Как распределить значения в определенном диапазоне (0 - 1.0)
weights = {u'obj_1': 0.018564743024138134, u'obj_2': 0.012814665648003992,
u'obj_3': 0.38978992409415425, u'obj_4': 0.0594938403597285,
u'obj_5': 0.41613932145700294, u'obj_6': 0.10319750541697208}
Я хочу, чтобы иметь возможность установить новое значение для одного из них, и разница будет равномерно распределить на все остальные. Сумма всех значений всегда должна быть 1,0.
Я написал это, чтобы сделать именно это.
set_inf = "obj_4"
set_weight = 0.9
rest = set_weight-weights[set_inf]
distribute_count = len(weights)-1
distribute_weight = rest/distribute_count
for inf, val in weights.items():
if inf == set_inf:
weights[inf] = set_weight
else:
new_val = val-distribute_weight
weights[inf] = new_val
print "%s : %s" % (inf, weights[inf])
Какие выходы:
obj_3 : 0.221688692166
obj_2 : -0.15528656628
obj_1 : -0.149536488904
obj_6 : -0.0649037265111
obj_5 : 0.248038089529
obj_4 : 0.9
Total sum: 1.0
obj_4 устанавливается значение, я хочу, и сумма равна 1,0. Проблема в том, что я хочу удостовериться, что каждое значение никогда не меньше 0 и никогда больше 1.0.
Вот где возникает путаница, и я не уверен, что это лучший способ справиться с этим. Если я ограничу значения, он должен по-прежнему компенсировать другие значения, иначе сумма не будет равна 1,0. Как я могу добиться чего-то подобного?
set_weight
может быть любым значением от 0 до 1,0.
математически эта проблема у вас имеет бесконечное количество решений.Предполагая, что вы устанавливаете 'obj_3', сумма всех остальных объектов должна быть равна 1 - obj_3. Есть бесконечные способы сделать это, даже если вы наложите на них неотрицательные условия. Длинная история, вам нужно придумать больше условий или оставить вещи на произвол. –
Я думаю, что хотел бы распределить разницу в зависимости от процента. Имеет ли это смысл? –