首页 > 解决方案 > 合并多个dicts列表,添加重复值并排序

问题描述

我有 3 个要合并和排序的字典列表。如果有多个具有相同_id的 dict ,则应删除重复项,但应将count_enabledand的值count_disabled添加(总和)到剩余的一个。列表可能有也可能没有重复,并且长度不同

Foo = [
   {'_id': 'core.system', 'count_enabled': 9, 'count_disabled': 0},
   {'_id': 'core.system', 'count_enabled': 0, 'count_disabled': 0}, 
   {'_id': 'core.private_channel', 'count_enabled': 4, 'count_disabled': 0}]
Bar = [
   {'_id': 'core.admin', 'count_enabled': 9, 'count_disabled': 0},
   {'_id': 'core.colors', 'count_enabled': 0, 'count_disabled': 0},
   {'_id': 'core.system', 'count_enabled': 0, 'count_disabled': 0}]
Baz = [
  {'_id': 'core.system', 'count_enabled': 0, 'count_disabled': 0},
  {'_id': 'core.whois', 'count_enabled': 9, 'count_disabled': 0}]

这是我到目前为止所拥有的:

data = []
for i in [Foo,Bar,Baz]:
    for j in i:
        data.append({'module':j['_id'], 'count_enabled' : j['count_enabled'], 'count_disabled': j['count_disabled']})

sort = sorted(data, key=itemgetter('module'))

我也在重命名_idmodule但这不是很重要,data正确排序唯一剩下的就是删除重复项并添加它们的值。

标签: pythonpython-3.x

解决方案


撇开排序,我认为可以使用下面的代码将所有字典合并到最终列表中。

我基本上final_list为唯一的字典条目创建了一个。

对于dict您的每个 s ,list我都会遍历final_dict. final_list如果我找到 a final_dictwith current _id,我总结这些值,然后跳出内部 for 循环继续到 next dictin list

_id如果在任何s 中都找不到final_dict,我将该字典附加到最终列表中。

final_list = []
lists = [Foo, Bar, Baz]
for lst in lists:
   for dct in lst:
      id_to_lookup = dct['_id']
      found_duplicate_flag = 0
      for final_dict in final_list:
         if final_dict['_id'] == id_to_lookup:
            found_duplicate_flag = 1
            final_dict['count_enabled'] += dct['count_enabled']
            final_dict['count_disabled'] += dct['count_disabled']
            break
      if found_duplicate_flag == 0:
         final_list.append(dct)

推荐阅读