在字典列表中,根据键合并列表

时间:2020-04-15 07:35:12

标签: python list dictionary

我在字典列表中嵌套了字典,我想基于'id'合并列表

res = [{'i': ['1'], 'id': '123'},
       {'i': ['1'], 'id': '123'},
       {'i': ['1','2','3','4','5','6'],'id': '123'},
       {'i': ['1'], 'id': '234'},
       {'i': ['1','2','3','4','5'],'id': '234'}]

所需的输出:

[{'i': [1, 1, 1, 2, 3, 4, 5, 6], 'id': '123'},
 {'i': [1, 1, 2, 3, 4, 5], 'id': '234'}]

我正在尝试基于键"id"合并嵌套字典。我不知道最好的出路:

import collections
d = collections.defaultdict(list)
for i in res:
    for k, v in i.items():
        d[k].extend(v)

上面的代码正在合并所有列表,但是我想基于键“ id”合并列表。

3 个答案:

答案 0 :(得分:2)

类似的事情应该可以解决问题

from collections import defaultdict

merged = defaultdict(list)
for r in res:
    merged[r['id']].extend(r['i'])

output = [{'id': key, 'i': merged_list} for key, merged_list in merged.items()]

答案 1 :(得分:1)

以下使用itertools.groupby产生所需的输出:

from operator import itemgetter
from itertools import groupby

k = itemgetter('id')

[
    {'id': k, 'i': [x for d in g for x in d['i']]} 
    for k, g in groupby(sorted(res, key=k), key=k)
]

答案 2 :(得分:0)

我不确定重复的情况下的预期行为-例如,列表应为:

  • set()一样对待吗?
  • 已添加,并且可能有多个项目,例如[1,1,2,3...]
  • 没关系-随便吃

这是我们使用dict comprehension的一种变体:

{item['id']: item for item in res}.values()
# [{'i': ['1', '2', '3', '4', '5'], 'id': '234'}, {'i': ['1', '2', '3', '4', '5', '6'], 'id': '123'}]

如果您在问题中提供了更多信息,我可以相应地更新答案。