首页 > 解决方案 > 如何合并具有相同特定键值的多个字典?

问题描述

我有这样的字典/键值对列表:

list = [{'mid': 123, 'msg': 'sometext', 'antivirus': 'positive'},
        {'mid': 123, 'msg': 'sometext2', 'antivirus': 'positive'},
        {'mid': 456, 'msg': 'sometext3', 'antivirus': 'positive'},
        {'mid': 456, 'msg': 'sometext4', 'antivirus': 'positive'},
        {'mid': 789, 'msg': 'sometext5', 'antivirus': 'positive'}]

我希望结果是一个新的 dict 列表(如果可能,以最有效的方式)按“ mid ”键的值对它们进行分组:

result = [{'mid': 123, 'msg': 'sometext,sometext2', 'antivirus': 'positive,positive'}, 
          {'mid': 456, 'msg': 'sometext3,sometext4', 'antivirus': 'positive,positive'},
          {'mid': 789, 'msg': 'sometext5', 'antivirus': 'positive'}]

标签: pythonjsonlistdictionary

解决方案


对这种方法并不是很兴奋,但它会让你到达那里。它lst使用 adefaultdict对字典列表进行迭代以按mid值分组,然后对其进行迭代产生输出,并连接msgantivirus键的值。

from collections import defaultdict

lst = [{'mid': 123, 'msg': 'sometext', 'antivirus': 'positive'},
       {'mid': 123, 'msg': 'sometext2', 'antivirus': 'positive'},
       {'mid': 456, 'msg': 'sometext3', 'antivirus': 'positive'},
       {'mid': 456, 'msg': 'sometext4', 'antivirus': 'positive'},
       {'mid': 789, 'msg': 'sometext5', 'antivirus': 'positive'}]

dd = defaultdict(list)
for d in lst:
    key = d['mid']
    dd[key].append(d)

output = []
for (k,v) in dd.items():
    output.append({
        'mid':       k,
        'msg':       ','.join(x['msg']       for x in v),
        'antivirus': ','.join(x['antivirus'] for x in v),
    })

print(output)
[
  {'mid': 123, 'msg': 'sometext,sometext2', 'antivirus': 'positive,positive'},
  {'mid': 456, 'msg': 'sometext3,sometext4', 'antivirus': 'positive,positive'},
  {'mid': 789, 'msg': 'sometext5', 'antivirus': '阳性'}
]

推荐阅读