天气预测记录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'}]
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'])
语句,在遍历,显示的结果如下: 这是我们想要的结果。
注意到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’) 返回一个可调用的对象。
# 对天气字段'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 函数返回值相同)的元素序列。 在每次迭代的时候,它会返回一个值和一个迭代器对象, 这个迭代器对象可以生成元素值全部等于上面那个值的组中所有对象。