将每个python字典值除以总值

Yan*_*May 14 python dictionary

我有 a = {'foo': 2, 'bar': 3, 'baz': 5 }

无论如何我可以进入a = {'foo': 0.2, 'bar': 0.3, 'baz': 0.5 }一条线?需要将每个值除以总值...我只是无法完成它... :(

非常感谢!

Mar*_*ers 26

对值进行求和,然后使用字典理解来生成具有规范化值的新字典:

total = sum(a.itervalues(), 0.0)
a = {k: v / total for k, v in a.iteritems()}
Run Code Online (Sandbox Code Playgroud)

你可以把它挤成一个单行,但它不会那么可读:

a = {k: v / total for total in (sum(a.itervalues(), 0.0),) for k, v in a.iteritems()}
Run Code Online (Sandbox Code Playgroud)

我给了sum()一个浮点运算初始值,以防止/经营者利用在Python 2楼师,如果这会发生total,并v会都为整数.

在Python 3中,删除iter*前缀:

a = {k: v / total for total in (sum(a.values()),) for k, v in a.items()}
Run Code Online (Sandbox Code Playgroud)

注意,你希望使用{k: v / sum(a.values()) for k, v in a.items()}这里; 在理解循环中为每次迭代执行值表达式,sum()一次又一次地重新计算.将sum()在字典中的所有N项循环,所以你最终的二次O(N ^ 2)的解决方案,而不是一个O(N)解决您的问题.

  • 我认为你在这里不需要 `total` `{k:v/sum(a.values(), 0.0) for k,v in a.items()}` (2认同)
  • @ user3100115:在这种情况下,`sum()`将运行*每个键值对*,每次都在所有值上运行一个完整的循环.你会产生一个N*N循环而不是N循环.我随时都会选择线性超过二次方. (2认同)