Ответ 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) для своей проблемы.