1

假设我有 2 个 OrderedDict(),我可以通过执行以下操作获得 (+) 操作的结果:

dict1 = OrderedDict([(52, 0),
         (53, 0),
         (1, 0),
         (2, 0),
         (3, 0),
         (4, 0),
         (5, 0),
         (6, 0),
         (7, 0),
         (8, 0),
         (9, 0),
         (10, 0),
         (11, 1)])

dict2 = OrderedDict([(52, 0),
         (53, 0),
         (1, 0),
         (2, 5),
         (3, 0),
         (4, 0),
         (5, 0),
         (6, 1),
         (7, 0),
         (8, 0),
         (9, 0),
         (10, 1),
         (11, 1)])

dict3 = OrderedDict((k, dict1[k] + dict2[k]) for k in dict1 if k in dict2)
print(dict3)
OrderedDict([(52, 0),
         (53, 0),
         (1, 0),
         (2, 5),
         (3, 0),
         (4, 0),
         (5, 0),
         (6, 1),
         (7, 0),
         (8, 0),
         (9, 0),
         (10, 1),
         (11, 2)])

我的问题是:如何概括上述操作,以便获得 N OrderedDict() 的 (+) 运算结果?

4

3 回答 3

1

通过测试每个键的每个其他字典的成员资格,您实际上是在执行集合交集的操作,但您实际上不能使用集合交集,因为集合在 Python 中是无序的。

您可以通过安装有序集包来解决此限制,以便您可以使用该OrderedSet.intersection方法在第一个字典中的键排序的字典中获取公共键,然后您可以对其进行迭代以构造一个新OrderedDict的每个值所有字典中当前键的值的总和:

from ordered_set import OrderedSet

dicts = [dict1, dict2]
common_keys = OrderedSet.intersection(*dicts)
print(OrderedDict((k, sum(d[k] for d in dicts)) for k in common_keys))

演示:https ://replit.com/@blhsing/FlawlessGrowlingAccounting

于 2021-03-18T10:42:26.763 回答
0

如果您不想安装外部包,使用此功能可以达到类似的效果:

 def add_dicts(*args):
     items_list = list()
     for k in args[0]:
         if all([k in arg for arg in args[1:]]):
             value = 0
             for arg in args:
                     value += arg[k]
             items_list.append((k, value))
     return OrderedDict(items_list)

调用它:

dict3 = add_dicts(dict1, dict2)
dict4 = add_dicts(dict1, dict2, dict3)

如果你想用字典列表来调用它:

dict_list=[dict1, dict2]
dict5 = add_dicts(*dict_list)

有关 *args 的更多信息可以在这个答案中找到

于 2021-03-18T14:24:09.610 回答
0

Some naive approach using map-reduce. Note that I didn't test the following code, so it might need some adjustments

import operator

dicts = [dict1, dict2, dict3, dict4]
dicts_keys = map(lambda d: set(d.keys()), dicts)
common_keys = set.intersection(*dicts_keys)
sum_dict = OrderedDict(
    (k, reduce(operator.add, map(lambda d: d[k], dicts)))
    for k in common_keys) 
于 2021-03-18T10:06:47.093 回答