python - 使用字典推导式添加和组合值?

标签 python dictionary dictionary-comprehension

假设我有一个列表:

a_list = [["Bob", 2], ["Bill", 1], ["Bob", 2]]

我想将它们添加到字典中并将这些值组合到相应的键中。所以,在这种情况下,我想要一个如下所示的字典:

{"Bob" : 4, "Bill" : 1}

如何使用字典理解来做到这一点?

这就是我所拥有的:

d1 = {group[0]: int(group[1]) for group in a_list}

最佳答案

要使用字典理解完成您想要的操作,您需要一个外部额外字典来跟踪到目前为止每个名称的值:

memory = {}
{name: memory[name] for name, count in a_list if not memory.__setitem__(name, count + memory.setdefault(name, 0))}

但这会产生两个字典,其总和为:

>>> a_list = [["Bob", 2], ["Bill", 1], ["Bob", 2]]
>>> memory = {}
>>> {name: memory[name] for name, count in a_list if not memory.__setitem__(name, count + memory.setdefault(name, 0))}
{'Bob': 4, 'Bill': 1}
>>> memory
{'Bob': 4, 'Bill': 1}

这是因为如果没有内存字典,您就无法访问每个名称的运行总和。

此时您也可以只使用字典和常规循环:

result = {}
for name, count in a_list:
    result[name] = result.get(name, 0) + count

collections.defaultdict() object :

from collections import defaultdict

result = defaultdict(int)
for name, count in a_list:
    result[name] += count

甚至是collections.Counter() object ,为您提供额外的多集功能供以后使用:

from collections import Counter

result = Counter()
for name, count in a_list:
    result[name] += count

另一个效率较低的选项是先对 a_list 进行排序,然后使用 itertools.groupby)() :

from itertools import groupby
from operator import itemgetter

key = itemgetter(0)  # sort by name
{name: sum(v[1] for v in group)
 for name, group in groupby(sorted(a_list, key=key), key)}

这是一种 O(NlogN) 方法与不带排序的简单循环 O(N) 方法。

关于python - 使用字典推导式添加和组合值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25918906/

相关文章:

python - 在 Pycharm 中以与 Jupyter 相同的方式可视化数据?

python - 在 matplotlib 上的等高线图中标记特定级别

python - 在python中合并字典值列表

c++ - 我如何更有效地插入 std::map

python使用for循环更新嵌套字典值与理解

python - python 如何正确使用2to3?

python - “元组”对象不支持项目分配

c++ - 将多个值存储为 map 中的键的最佳方法是什么

python - 具有取决于输入参数的通用理解返回类型的函数?

python - 如何在不创建任何新变量的情况下在字典理解中解压缩元组的值?