《Python Cookbook(第3版)中文版》——1.15 根据字段将记录分组
Python 记录 根据 中文版 字段 分组 Cookbook 1.15
2023-09-11 14:17:38 时间
本节书摘来自异步社区《Python Cookbook(第3版)中文版》一书中的第1章,第1.15节,作者[美]David Beazley , Brian K.Jones,陈舸 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.15 根据字段将记录分组 1.15.1 问题有一系列的字典或对象实例,我们想根据某个特定的字段(比如说日期)来分组迭代数据。
1.15.2 解决方案itertools.groupby()函数在对数据进行分组时特别有用。为了说明其用途,假设有如下的字典列表:
rows = [ {address: 5412 N CLARK, date: 07/01/2012}, {address: 5148 N CLARK, date: 07/04/2012}, {address: 5800 E 58TH, date: 07/02/2012}, {address: 2122 N CLARK, date: 07/03/2012}, {address: 5645 N RAVENSWOOD, date: 07/02/2012}, {address: 1060 W ADDISON, date: 07/02/2012}, {address: 4801 N BROADWAY, date: 07/01/2012}, {address: 1039 W GRANVILLE, date: 07/04/2012}, ]
现在假设想根据日期以分组的方式迭代数据。要做到这些,首先以目标字段(在这个例子中是date)来对序列排序,然后再使用itertools.groupby()。
from operator import itemgetter from itertools import groupby # Sort by the desired field first rows.sort(key=itemgetter(date)) # Iterate in groups for date, items in groupby(rows, key=itemgetter(date)): print(date) for i in items: print( , i)
这会产生如下的输出:
07/01/2012 {date: 07/01/2012, address: 5412 N CLARK} {date: 07/01/2012, address: 4801 N BROADWAY} 07/02/2012 {date: 07/02/2012, address: 5800 E 58TH} {date: 07/02/2012, address: 5645 N RAVENSWOOD} {date: 07/02/2012, address: 1060 W ADDISON} 07/03/2012 {date: 07/03/2012, address: 2122 N CLARK} 07/04/2012 {date: 07/04/2012, address: 5148 N CLARK} {date: 07/04/2012, address: 1039 W GRANVILLE}1.15.3 讨论
函数groupby()通过扫描序列找出拥有相同值(或是由参数key指定的函数所返回的值)的序列项,并将它们分组。groupby()创建了一个迭代器,而在每次迭代时都会返回一个值(value)和一个子迭代器(sub_iterator),这个子迭代器可以产生所有在该分组内具有该值的项。
在这里重要的是首先要根据感兴趣的字段对数据进行排序。因为groupby()只能检查连续的项,不首先排序的话,将无法按所想的方式来对记录分组。
如果只是简单地根据日期将数据分组到一起,放进一个大的数据结构中以允许进行随机访问,那么利用defaultdict()构建一个一键多值字典(multidict,见1.6节)可能会更好。例如:
from collections import defaultdict rows_by_date = defaultdict(list) for row in rows: rows_by_date[row[date]].append(row)
这使得我们可以方便地访问每个日期的记录,如下所示:
for r in rows_by_date[07/01/2012]: ... print(r) {date: 07/01/2012, address: 5412 N CLARK} {date: 07/01/2012, address: 4801 N BROADWAY}
对于后面这个例子,我们并不需要先对记录做排序。因此,如果不考虑内存方面的因素,这种方式会比先排序再用groupby()迭代要来的更快。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- python安装python-lzf包,报错lzf_module.c:3:20: fatal error: Python.h: No such file or directory
- How to run python interactive in current file's directory in Visual Studio Code? Python路径问题
- Python实现多线程并发下载大文件(断点续传支持)
- Eclipse Kepler SR2 + Python 3.4 + JDK7+Pydev3.4 搭建 python 开发环境(MAC)
- 【零基础学python】:清华官方出品的《看漫画学Python》全彩PDF,495页资源分享
- python中defaultdict用法详解
- Python input() 条件语句等总结
- 【Python】【PyPI】twine模块打包python项目上传pypi
- 《Python和Pygame游戏开发指南》——2.3 建立一个Pygame程序
- 《“笨办法”学Python(第3版)》——习题4 变量和命名
- python学习之OpenCV-Python模块的部分应用示例(生成素描图和动漫图)
- python 字符串匹配算法设计
- 用Python解锁更多乐趣和生产力:发现为什么大多数人都在学它
- Python 桌面程序教程之 02 一次性窗口,自动关闭模式(教程含源码)
- Python 实现被动收入教程之我如何使用 python 制作我的第一个高级telegram机器人
- 《Python语言程序设计》—— 导读
- 自制基于HMM的python中文分词器
- python函数之xticks实现时间作为横坐标并按指定间隔显示
- Python 基础 之 python 线程知识点整理,并实现一个简单多线程 udp 聊天应用
- python日志模块的使用
- 记录python接口自动化测试--把测试结果写进excel文件(第九目)
- 记录python接口自动化测试--从excel中读取params参数传入requests请求不生效问题的解决过程(第七目)
- Python生成二维码
- Python自动化交易学习笔记(10)——1.添加卖出条件参数配置,2.交易单位大小
- Python实现数值列表(数组)的逆置输出