Попробуйте изменить на месте:
d={'a':0.2, 'b':0.3}
factor=1.0/sum(d.itervalues())
for k in d:
d[k] = d[k]*factor
результат:
>>> d
{'a': 0.4, 'b': 0.6}
В качестве альтернативы для изменения в новый словарь, использовать Dict понимание:
d={'a':0.2, 'b':0.3}
factor=1.0/sum(d.itervalues())
normalised_d = {k: v*factor for k, v in d.iteritems() }
Обратите внимание на использование d.iteritems(), который использует меньше памяти, чем d.items(), поэтому лучше для большого словаря.
EDIT: Поскольку существует довольно много из них, и получить это право, кажется, важно, я кратко все идеи в комментариях к этому ответу вместе с следующим (включая заимствование что-то из this post) :
import math
import operator
def really_safe_normalise_in_place(d):
factor=1.0/math.fsum(d.itervalues())
for k in d:
d[k] = d[k]*factor
key_for_max = max(d.iteritems(), key=operator.itemgetter(1))[0]
diff = 1.0 - math.fsum(d.itervalues())
#print "discrepancy = " + str(diff)
d[key_for_max] += diff
d={v: v+1.0/v for v in xrange(1, 1000001)}
really_safe_normalise_in_place(d)
print math.fsum(d.itervalues())
Взял пару идет придумать словарь, который фактически создал ненулевую ошибку при нормализации, но надеюсь, что это иллюстрирует точку.
Что вы имеете в виду нормализуют? – Mark
Сумма значений должна быть равна единице. – 2013-05-07 11:35:38
Вы хотите заменить значения в оригинальном словаре или хотите новый? –