Одним из способов является использование itertools.groupby()
:
from itertools import groupby
print([{"name": key, "data": [(g['date'], g['price']) for g in group]}
for key, group in groupby(my_list, lambda x: x['name'])])
#[{'name': 'AAA', 'data': [('2018-05-14', 20.0), ('2018-05-15', 22.0), ('2018-05-16', 30.0)]},
# {'name': 'BBB', 'data': [('2018-05-14', 15.0), ('2018-05-15', 32.0)]}]
Первый аргумент groupby
является итеративным, в данном случае my_list
.
Второй аргумент являетсяфункция, которая определяет, как создавать группы, в этом случае вы извлекаете ключ name
.
Примечание : это сгруппирует последовательных элементов с одинаковыми name
, поэтому предполагается, что my_list
уже отсортировано по имени.Если нет, вы можете сначала отсортировать, используя:
my_list = sorted(my_list, key=lambda x: x['name'])
Затем мы можем выполнить итерацию по всем парам (key, group)
из вывода groupby()
и выполнить понимание списка.
Внутри спискаПонимание, мы делаем DICT понимание {"name": key, "data": [(g['date'], g['price']) for g in group]}
, чтобы построить словарь вида {'name': key, 'data': [[date,price]]}
для каждого name
.