Python:用groupby() 进行字段分组

本文介绍了如何使用Python的itertools.groupby函数对字典序列进行分组,首先展示了对天气'weather'字段进行分组的步骤,强调了排序的重要性。接着,演示了对日期'date'字段进行分组,并使用itemgetter简化代码。最后,展示了如何对多个字段(如'weather'和'date')进行分组和排序,以获取理想结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


我们要对一个字典的序列,按照某一个特征分组,例如按照天气weather、日期date分组迭代显示。

天气预测记录record:
[{'date': '2021-09-15', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'sunny'},
{'date': '2021-09-14', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'rain'},
{'date': '2021-09-13', 'weather': 'cloud'},
{'date': '2021-09-14', 'weather': 'rain'}]

1、对 ‘weather’ 字段进行分组

record = [{'date': '2021-09-15', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'sunny'},
{'date': '2021-09-13', 'weather': 'rain'},
{'date': '2021-09-14', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'cloud'},
{'date': '2021-09-14', 'weather': 'rain'}]

# 对天气字段'weather'分组汇总
from itertools import groupby
for k, items in groupby(record, key=lambda x:x['weather']):
    print(k)
    for i in items: 
        print(i)

在这里插入图片描述
可以发现,分出来的结果不是我们所理想的。因为groupby() 仅仅检查连续的元素,如果事先并没有排序完成的话,分组函数将得不到想要的结果。

# 排序
record.sort(key=lambda x: x['weather'])

# 对天气字段'weather'分组汇总
for k, items in groupby(record, key=lambda x:x['weather']):
    print(k)
    for i in items: 
        print(i)

增加排序 record.sort(key=lambda x: x['weather']) 语句,在遍历,显示的结果如下: 这是我们想要的结果。

在这里插入图片描述


2、对 ‘date’ 字段进行分组

注意到sort 和groupby 所用的key 函数,除了lambda 写法外,还有一种简写,就是使用itemgetter

from operator import itemgetter
from itertools import groupby

record = [{'date': '2021-09-15', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'sunny'},
{'date': '2021-09-13', 'weather': 'rain'},
{'date': '2021-09-14', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'cloud'},
{'date': '2021-09-14', 'weather': 'rain'}]

# 排序
record.sort(key=itemgetter('date'))

# 对日期字段'date'分组汇总
for k, items in groupby(record, key=itemgetter('date')):
    print(k)
    for i in items: 
        print(i)

在这里插入图片描述
itemgetter 是一个类, itemgetter(‘weather’) 返回一个可调用的对象。


3、对 groupby 多字段进行分组

# 对天气字段'weather'分组汇总,对date在组内排序
from itertools import groupby
from operator import itemgetter

record = [{'date': '2021-09-15', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'sunny'},
{'date': '2021-09-13', 'weather': 'rain'},
{'date': '2021-09-14', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'cloud'},
{'date': '2021-09-14', 'weather': 'rain'}]

# 排序weather 和date 两个字段
record.sort(key=itemgetter('weather', 'date'))

for k, items in groupby(record, itemgetter('weather')):
    print("天气:", k)
    for i in items: 
        print(i)

结果如下,使用weather 和date 两个字段排序:
在这里插入图片描述

groupby() 函数扫描整个序列并且查找连续相同值(或者根据指定 key 函数返回值相同)的元素序列。 在每次迭代的时候,它会返回一个值和一个迭代器对象, 这个迭代器对象可以生成元素值全部等于上面那个值的组中所有对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐樽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值