微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在python中添加N OrderDict()

如何解决如何在python中添加N OrderDict()

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

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

dict2 = OrderedDict([(52,5),1),1)])

dict3 = OrderedDict((k,dict1[k] + dict2[k]) for k in dict1 if k in dict2)
print(dict3)
OrderedDict([(52,2)])

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

解决方法

通过测试每个键是否属于其他字典,您实际上是在执行集合交集的操作,但实际上您不能使用集合交集,因为集合在 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

,

一些使用 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) 
,

如果您不想安装外部包,可以使用此功能实现类似的结果:

 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,dict3)

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

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

有关 *args 的更多信息可以在此 answer

中找到

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。