python - 如何通过使用公共(public)键对值求和来从字典列表创建单个 Python 字典?

标签 python

我有一个字典列表,例如:

dictList = [
    {'a':3, 'b':9, 'c':4},
    {'a':9, 'b':24, 'c':99},
    {'a':10, 'b':23, 'c':88}
]

所有词典都有相同的键,例如abc。我希望创建一个具有相同键的字典,其中的值是原始列表中所有字典中具有相同键的值的总和。

所以对于上面的例子,输出应该是:

{'a':22, 'b':56, 'c':191}

最有效的方法是什么?我目前有:

result = {}
for myDict in dictList:
    for k in myDict:
        result[k] = result.setdefault(k, 0) + myDict[k]

最佳答案

如果所有的字典都有所有的键,你可以这样做:

>>> dict((key, sum(d[key] for d in dictList)) for key in dictList[0])
{'a': 22, 'b': 56, 'c': 191}

[编辑] 如果速度是重中之重,您也可以使用以下代码来减少约 20%(尽管以牺牲一些可读性为代价):

import operator, itertools
dict((key, sum(itertools.imap(operator.itemgetter(key), dictList))) 
      for key in dictList[0])

速度取决于字典的大小。对于原始的 3 项列表和各种不同的大小(通过将原始列表乘以 10、100 或 1000 等创建),我得到以下时间:

List Size   Original      dict+generator       imap+itemgetter
      3      0.054          0.090                0.097
     30      0.473          0.255                0.236
    300      4.668          1.884                1.529
   3000     46.668         17.975               14.499

(10,000 次运行的所有时间)

所以它对于只有 3 个列表来说稍微慢一些,但是对于更大的列表来说速度是原来的两到三倍。

关于python - 如何通过使用公共(public)键对值求和来从字典列表创建单个 Python 字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/974678/

相关文章:

python - 使用 Python 的 panda.Dataframe 对多传感器时间序列数据进行子采样

python - 带 Python 的 Vim : Make ":make" take me to the error

python - 删除具有 South 依赖性的 Django 应用程序

python - 如何下载没有 "installing"的 Anaconda 软件包?

python - 如何在 python 中检查字符串中的这个或那个字符?

python - 如何在 Django 中创建动态创建的单选按钮表单

python - 如何处理来自谷歌地图 api 的错误?

python - 向多个用户推送带有视频的同一张卡

python - 如何每 N 分钟重复一个函数?

python - 删除二叉树最左边的叶子