有条件地合并多个词典

ron*_*ved 7 python dictionary

我有N个字典,包含相同的键,值为整数.我想根据最大值将这些合并到一个字典中.目前我有这样的事情:

max_dict = {}
for dict in original_dict_list:
    for key, val in dict.iteritems():
        if key not in max_dict or max_dict[key] < val:
            max_dict[key] = val
Run Code Online (Sandbox Code Playgroud)

有没有更好的(或更"pythonic")方式这样做?

Mar*_*ers 7

使用collection.Counter()对象,它们本身支持"合并"计数:

from collections import Counter

max_dict = Counter()
for d in original_dict_list:
    max_dict |= Counter(d)
Run Code Online (Sandbox Code Playgroud)

甚至:

from collections import Counter
from operator import or_

max_dict = reduce(or_, map(Counter, original_dict_list))
Run Code Online (Sandbox Code Playgroud)

Counter对象是多组的(有时也称为"包").该|运营商对两个计数器进行联合,存储最大计数对于给定的关键.

A Counter也是一个直接的子类dict,所以你可以(大多数)像对待任何其他字典一样对待它.

演示:

>>> from collections import Counter
>>> from operator import or_
>>> original_dict_list = [{'foo': 3, 'bar': 10}, {'foo': 42, 'spam': 20}, {'bar': 5, 'ham': 10}]
>>> reduce(or_, map(Counter, original_dict_list))
Counter({'foo': 42, 'spam': 20, 'bar': 10, 'ham': 10})
Run Code Online (Sandbox Code Playgroud)