按键遍历字典和组项目列表

Vla*_*lad 1 python grouping dictionary

我有一些字典:

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}
    ]
Run Code Online (Sandbox Code Playgroud)

我的问题是如何遍历该列表以生成这种格式的列表?

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]]}
    ]
Run Code Online (Sandbox Code Playgroud)

我尝试了此问题中描述的方法:Python:将字典中的列表项分组, 但是我需要不同的输出格式,因此我无法弄清楚需要更改的内容。

pau*_*ult 6

一种方法是使用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)]}]
Run Code Online (Sandbox Code Playgroud)

的第一个参数groupby是一个可迭代对象,在本例中为my_list

第二个参数是一个定义如何创建组的函数,在这种情况下,您提取 key name

注意:这会将具有相同 的连续项目分组name,因此它假定my_list已经根据名称进行了排序。如果没有,您可以先使用以下方法进行排序:

my_list = sorted(my_list, key=lambda x: x['name'])
Run Code Online (Sandbox Code Playgroud)

然后我们可以迭代(key, group)来自输出的所有对groupby()并进行列表理解。

在列表理解中,我们做一个字典理解{"name": key, "data": [(g['date'], g['price']) for g in group]}{'name': key, 'data': [[date,price]]}为每个name.


stu*_*ent 5

一种方法是使用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)
Run Code Online (Sandbox Code Playgroud)

结果:

[{'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]]}]
Run Code Online (Sandbox Code Playgroud)