遍历字典列表并按键分组

8

我有一个字典列表:

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: group list items in a dict,但我需要一种不同的输出格式,而且我无法确定需要更改什么。

2个回答

14

一种方法是使用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 tmp.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]]}]

7

一种方法是使用 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'])

然后,我们可以遍历groupby()输出的所有(key, group)对,并进行列表推导式。
在列表推导式中,我们使用字典推导式{"name": key, "data": [(g['date'], g['price']) for g in group]}来构建每个name的形式为{'name': key, 'data': [[date,price]]}的字典。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接