внутри списка словарей, объединять списки на основе ключа - PullRequest
2 голосов
/ 15 апреля 2020

У меня есть вложенные словари в списке словарей, я хочу объединить списки на основе '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 ]

2 голосов
/ 15 апреля 2020

Нечто подобное должно сработать

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 голос
/ 15 апреля 2020

Следующее производит желаемый вывод, используя 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)
]
0 голосов
/ 15 апреля 2020

Я не уверен, каким должно быть ожидаемое поведение при наличии дубликатов - например, должны ли списки:

  • рассматриваться как 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'}]

Если вы предоставите немного больше информации в своем вопросе, я могу соответствующим образом обновить ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...