Что такое питоновский способ построения диктата словарных списков по атрибуту?

Я ищу pythonic способ конвертировать список кортежей, который выглядит так:

res = [{type: 1, name: 'Nick'}, {type: 2, name: 'Helma'}, ...] 

Чтобы прописать так:

  {1: [{type: 1, name: 'Nick'}, ...], 2: [{type: 2, name: 'Helma'}, ...]} 

Теперь я делаю это с таким кодом ( на основе этого вопроса ):

  d = defaultdict(list) for v in res: d[v["type"]].append(v) 

Является ли это питоническим способом построения dict списков объектов по атрибуту?

Я согласен с комментаторами в том, что здесь, понимание списка не будет, ну, понимание.

Сказав это, вот как это можно сделать:

 import itertools a = [{'type': 1, 'name': 'Nick'}, {'type': 2, 'name': 'Helma'}, {'type': 1, 'name': 'Moshe'}] by_type = lambda a: a['type'] >>> dict([(k, list(g)) for (k, g) in itertools.groupby(sorted(a, key=by_type), key=by_type)]) {1: [{'name': 'Nick', 'type': 1}, {'name': 'Moshe', 'type': 1}], ...} 

Код сначала сортируется по 'type' , а затем использует itertools.groupby для группировки по той же самой критерию.


Я прекратил понимать этот код через 15 секунд после того, как закончил писать 🙂

Вы могли бы сделать это со словарным пониманием, которое не было бы таким неразборчивым или непонятным, как предлагают комментарии (ИМХО):

 # A collection of name and type dictionaries res = [{'type': 1, 'name': 'Nick'}, {'type': 2, 'name': 'Helma'}, {'type': 3, 'name': 'Steve'}, {'type': 1, 'name': 'Billy'}, {'type': 3, 'name': 'George'}, {'type': 4, 'name': 'Sylvie'}, {'type': 2, 'name': 'Wilfred'}, {'type': 1, 'name': 'Jim'}] # Creating a dictionary by type res_new = { item['type']: [each for each in res if each['type'] == item['type']] for item in res } >>>res_new {1: [{'name': 'Nick', 'type': 1}, {'name': 'Billy', 'type': 1}, {'name': 'Jim', 'type': 1}], 2: [{'name': 'Helma', 'type': 2}, {'name': 'Wilfred', 'type': 2}], 3: [{'name': 'Steve', 'type': 3}, {'name': 'George', 'type': 3}], 4: [{'name': 'Sylvie', 'type': 4}]} 

Если я ничего не пропустил, это должно дать вам результат, который вы ищете.