【问题标题】:How to add N OrderDict() in python如何在 python 中添加一个 OrderedDict()
【发布时间】:2021-06-15 17:01:27
【问题描述】:

假设我有 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() 的 (+) 运算结果?

【问题讨论】:

标签: python ordereddictionary ordereddict


【解决方案1】:

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

你可以通过安装ordered-set 包来解决这个限制,这样你就可以使用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

【讨论】:

    【解决方案2】:

    一些使用 map-reduce 的幼稚方法。请注意,我没有测试以下代码,因此可能需要进行一些调整

    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) 
    

    【讨论】:

    • 集合在 Python 中是无序的,因此通过使用集合操作,您不会得到可预测的有序结果,而迭代 OrderedDict 会。
    【解决方案3】:

    如果你不想安装外部包,使用这个函数也可以达到类似的效果:

     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 的信息可以在answer找到

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 2018-08-09
      • 2016-11-07
      • 2013-11-30
      • 2013-05-15
      相关资源
      最近更新 更多