社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

有没有办法在python字典和列表中对值进行分组?

asd-qwert • 3 年前 • 1261 次点击  

我目前有一个类似以下内容的值列表:

lst = [{'Amount': 13.5, 'Name': 'Amy', 'date': '2022-01-30'}, 
{'Amount': 15, 'Name': 'Bob', 'date': '2022-01-30'}, 
{'Amount': 13.5, 'Name': 'Cara', 'date': '2022-01-31'}]

我如何按日期分组?

[{'date': '2022-01-30', 'details': [{'Amount': 13.5, 'Name': 'Amy'}, {'Amount': 15, 'Name': 'Bob'}]},
{'date': '2022-01-31', 'details': [{'Amount': 13.5, 'Name': 'Cara'}]

我试过用for loop做些什么,但似乎对我不起作用

final_data = []

for i in lst:
    temp_data = {}
    if i['date'] not in temp_data:
        temp_data['date'] = i['date']
        final_data.append(temp_data)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/130533
 
1261 次点击  
文章 [ 2 ]  |  最新文章 3 年前
hc_dev
Reply   •   1 楼
hc_dev    3 年前

自我实现的方式是使用for循环,并添加到所需的结构中。

您还可以使用标准库中的模块 itertools.groupby , 当输入被排序时 (之前)。

分组

from itertools import groupby

lst = [
   {'Amount': 13.5, 'Name': 'Amy', 'date': '2022-01-30'}, 
   {'Amount': 15, 'Name': 'Bob', 'date': '2022-01-30'}, 
   {'Amount': 13.5, 'Name': 'Cara', 'date': '2022-01-31'}
]
keyfunc = lambda x: x['date']  # extracting the key for sort and group

groups = []
uniquekeys = []

data = sorted(lst, key=keyfunc)  # required for groupby
for k, g in groupby(data, keyfunc):
    groups.append({'date': k, 'details': list(g)})  # Store group iterator as a list
    uniquekeys.append(k)

print(groups)

印刷品:

[{'date': '2022-01-30', 'details': [{'Amount': 13.5, 'Name': 'Amy', 'date': '2022-01-30'}, {'Amount': 15, 'Name': 'Bob', 'date': '2022-01-30'}]}, {'date': '2022-01-31', 'details': [{'Amount': 13.5, 'Name': 'Cara', 'date': '2022-01-31'}]}]

取下钥匙

自从你的输出在 details 不只是一个分组列表,而是删除了键(用于分组方式),我们需要进行一些调整:

from itertools import groupby

lst = [
   {'Amount': 13.5, 'Name': 'Amy', 'date': '2022-01-30'}, 
   {'Amount': 15, 'Name': 'Bob', 'date': '2022-01-30'}, 
   {'Amount': 13.5, 'Name': 'Cara', 'date': '2022-01-31'}
]
keyfunc = lambda x: x['date']  # extracting the key for sort and group

groups = []

data = sorted(lst, key=keyfunc)  # required for groupby
for k, g in groupby(data, keyfunc):
    # remove the key from grouped list
    removed_key = []
    for v in list(g):
        del v['date']
        removed_key.append(v)
    # add to groups  
    groups.append({'date': k, 'details': removed_key})

print(groups)

所需打印:

[{'date': '2022-01-30', 'details': [{'Amount': 13.5, 'Name': 'Amy'}, {'Amount': 15, 'Name': 'Bob'}]}, {'date': '2022-01-31', 'details': [{'Amount': 13.5, 'Name': 'Cara'}]}]
mozway
Reply   •   2 楼
mozway    3 年前

我建议使用字典作为输出:

from collections import defaultdict
out = defaultdict(list)

for d in lst:
    d = d.copy() # avoids mutating the original dictionaries.
    out[d.pop('date')].append(d)

dict(out)

输出:

{'2022-01-30': [{'Amount': 13.5, 'Name': 'Amy'}, {'Amount': 15, 'Name': 'Bob'}],
'2022-01-31': [{'Amount': 13.5, 'Name': 'Cara'}]}

如果你真的想要你的格式:

out2 = [{'date': k, 'details': v} for k,v in out.items()]

输出:

[{'date': '2022-01-30', 'details': [{'Amount': 13.5, 'Name': 'Amy'}, {'Amount': 15, 'Name': 'Bob'}]},
 {'date': '2022-01-31', 'details': [{'Amount': 13.5, 'Name': 'Cara'}]}]
第一部分无违约条款:
out = {}

for d in lst:
    d = d.copy()
    date = d.pop('date')
    if date not in out:
        out[date] = []
    out[date].append(d)
一次完成两部分:
out = {}

for d in lst:
    d = d.copy()
    date = d.pop('date')
    if date not in out:
        out[date] = {'date': date, 'details': []}
    out[date]['details'].append(d)

out = list(out.values())