我有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”)方式?
答案 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() }