有条件地合并多个词典

时间:2014-01-29 13:52:06

标签: 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

是否有更好的(或更“pythonic”)方式?

3 个答案:

答案 0 :(得分:7)

使用collection.Counter() objects代替它们本身支持“合并”计数:

from collections import Counter

max_dict = Counter()
for d in original_dict_list:
    max_dict |= Counter(d)

甚至:

from collections import Counter
from operator import or_

max_dict = reduce(or_, map(Counter, original_dict_list))

Counter个对象是多组的(有时也称为“包”)。 |运算符在两个计数器上执行并集,存储给定键的最大计数。

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})

答案 1 :(得分:2)

假设并非所有词典都包含所有键:

keys = set(k for x in original_dict_list for k in x)
max_dict = {k:max([x[k] for x in original_dict_list if k in x]) for k in keys}

答案 2 :(得分:0)

max_dict = { k:max([v]+[ _dict[k] for _dict in original_dict_list[1:] ])
             for k,v in original_dict_list[0].items() }