[英]Iterate over list of dict and group item by key
我有一个字典列表:
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但我需要不同的输出格式,我无法弄清楚我需要改变什么。
一种方法可能是使用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]]}]
一种方法是使用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
已经根据 name 进行了排序。 如果没有,您可以先使用以下方法进行排序:
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': key, 'data': [[date,price]]}
每个name
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.