Разделите каждое значение словаря python на общее значение

У меня есть   a = {'foo': 2, 'bar': 3, 'baz': 5 }

В любом случае я могу получить a = {'foo': 0.2, 'bar': 0.3, 'baz': 0.5 } в одной строке? Необходимо разделить каждое значение на общее значение... Я просто не могу это сделать..: (

Большое вам спасибо!

Ответ 1

Суммируйте значения, затем используйте понимание словаря для создания нового словаря с нормализованными значениями:

total = sum(a.itervalues(), 0.0)
a = {k: v / total for k, v in a.iteritems()}

Вы можете сжать его в однострочный, но он не будет таким читаемым:

a = {k: v / total for total in (sum(a.itervalues(), 0.0),) for k, v in a.iteritems()}

Я дал sum() начальное значение с плавающей запятой, чтобы оператор / не использовал разделение полов в Python 2, что произойдет, если total и v будут целыми числами.

В Python 3 снимите префиксы iter*:

a = {k: v / total for total in (sum(a.values()),) for k, v in a.items()}

Обратите внимание, что вы не хотите использовать {k: v / sum(a.values()) for k, v in a.items()} здесь; выражение выражения выполняется для каждой итерации в контуре понимания, повторное вычисление sum() снова и снова. sum() пересекает все N элементов в словаре, поэтому вы получаете квадратичное решение O (N ^ 2), а не решение O (N) для своей проблемы.

Ответ 2

Я сделал это, используя функцию

a = {'foo': 2, 'bar': 3, 'baz': 5}  
def func1(my_diction):  
    total = 0  
    for i in my_diction:  
        total = total + my_diction[i]  
    for j in my_diction:  
        my_diction[j] = (float)(my_diction[j])/total  
    return my_diction     

print (func1(a))

Ответ 3

def div_d(my_dict):

    sum_p = sum(my_dict.values())

    for i in my_dict:
        my_dict[i] = float(my_dict[i]/sum_p)

    return my_dict 

p.s Я совершенно новичок в программировании, но это лучшее, что я мог придумать.

Ответ 4

почему выражение не работает без запятых a = {k: v/total для total в (sum (a.values()),) для k, v в a.items()}