Перебирайте список элементов dict и group по ключу - PullRequest
0 голосов
/ 23 мая 2018

У меня есть список диктов:

my_list = [
    {'name': 'AAA', 'date': '2018-05-14', 'price': 20.0},
    {'name': 'AAA', 'date': '2018-05-15', 'price': 22.0},
    {'name': 'AAA', 'date': '2018-05-16', 'price': 30.0},
    {'name': 'BBB', 'date': '2018-05-14', 'price': 15.0},
    {'name': 'BBB', 'date': '2018-05-15', 'price': 32.0}
    ]

Мой вопрос: как я могу выполнить итерацию по этому списку, чтобы создать список в этом формате?

parsed_list = [
    {'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]]}
    ]

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

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Одним из способов может быть использование defaultdict:

from collections import defaultdict

my_list = [
    {'name': 'AAA', 'date': '2018-05-14', 'price': 20.0},
    {'name': 'AAA', 'date': '2018-05-15', 'price': 22.0},
    {'name': 'AAA', 'date': '2018-05-16', 'price': 30.0},
    {'name': 'BBB', 'date': '2018-05-14', 'price': 15.0},
    {'name': 'BBB', 'date': '2018-05-15', 'price': 32.0}
    ]

tmp = defaultdict(list)

for item in my_list:
    tmp[item['name']].append([item['date'],item['price']])

parsed_list = [{'name':k, 'data':v} for k,v in parsed_list.items()]
print(parsed_list)

Результат:

[{'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]]}]
0 голосов
/ 23 мая 2018

Одним из способов является использование 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.

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