Группировать Используя ключ из списка словарей во вложенный список структуры словаря в Python 3 - PullRequest
5 голосов
/ 03 мая 2020

У меня есть список словарей:

list_dicts = [{'d_id': 917, 'desc': 'ADDDAAAA', 'b_id': 223, 'ben': 'BBXXBB'}, 
              {'d_id': 918, 'desc': 'CCCDEEC', 'b_id': 226, 'ben': 'DCCD'}, 
              {'d_id': 923, 'desc': 'EEEEDC', 'b_id': 223, 'ben': 'BBXXBB'},
              {'d_id': 945, 'desc': 'YTHSS', 'b_id': 226, 'ben': 'DCCD'}]

Этот list_dicts довольно большой и содержит более ок. 500 словарей. Я хочу сгруппировать этот список словарей, используя b_id, в такой формат:

new_list = [
            {'b_id': 223, 'ben': 'BBXXBB', 'items': [{'d_id': 917, 'desc': 'ADDDAAAA'},
                                                     {'d_id': 923, 'desc': 'EEEEDC'}],
            {'b_id': 226, 'ben': 'DCCD', 'items': [{'d_id': 918, 'desc': 'CCCDEEC'},
                                                  {'d_id': 945, 'desc': 'YTHSS'}]
           ]

Здесь ключ ben одинаков для того же b_id. Новый список словарей должен быть создан с ключом items, который содержит d_id и desc с тем же b_id.

Я проверил другие вопросы, используя групповую обработку и фильтр, но не смог получить указанный формат. Пожалуйста, предложите подходящий и оптимизированный метод для группировки в указанном формате.

Заранее спасибо.

1 Ответ

2 голосов
/ 03 мая 2020

Вы можете сделать это без itertools.groupby:

list_dicts = [{'d_id': 917, 'desc': 'ADDDAAAA', 'b_id': 223, 'ben': 'BBXXBB'},
              {'d_id': 918, 'desc': 'CCCDEEC', 'b_id': 226, 'ben': 'DCCD'},
              {'d_id': 923, 'desc': 'EEEEDC', 'b_id': 223, 'ben': 'BBXXBB'},
              {'d_id': 945, 'desc': 'YTHSS', 'b_id': 226, 'ben': 'DCCD'}]

out = {}
for d in list_dicts:
    out.setdefault(d['b_id'], []).append(d)

new_list = []
for key in out.keys():
    new_list.append({'b_id': key, 'ben': out[key][0]['ben'], 'items': [{'d_id': v['d_id'], 'desc': v['desc']} for v in out[key]]})

# pretty print new_list to screen:
from pprint import pprint
pprint(new_list)

Отпечатки:

[{'b_id': 223,
  'ben': 'BBXXBB',
  'items': [{'d_id': 917, 'desc': 'ADDDAAAA'},
            {'d_id': 923, 'desc': 'EEEEDC'}]},
 {'b_id': 226,
  'ben': 'DCCD',
  'items': [{'d_id': 918, 'desc': 'CCCDEEC'}, 
            {'d_id': 945, 'desc': 'YTHSS'}]}]
...