通过某个字段将记录分组

问题

你有一个字典或者实例的序列,然后你想根据某个特定的字段比如 date 来分组迭代访问。

解法

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 分组后的数据块上进行迭代。为了这样做,你首先需要按照指定的字段 (这里就是 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'}

讨论

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

一个非常重要的准备步骤是要根据指定的字段将数据排序。因为 groupby() 仅仅检查连续的元素,如果事先并没有排序完成的话,分组函数将得不到想要的结果。

如果你仅仅只是想根据 date 字段将数据分组到一个大的数据结构中去,并且允许
随机访问,那么你最好使用 defaultdict() 来构建一个多值字典,关于多值字典已经
在 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() 函数迭代的方式运行得快一些。

《Python Cookbook 3rd》笔记(1.15):通过某个字段将记录分组相关推荐

  1. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  2. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  3. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  4. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  5. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  6. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  7. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  8. 《Python cookbook》笔记一

    <Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...

  9. 《Python Cookbook 3rd》笔记(5.15):打印不合法的文件名

    打印不合法的文件名 问题 你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名的时候程序崩溃,出现了 UnicodeEncodeError 异常和一条奇怪的消息-- surrogates n ...

  10. 《Python Cookbook 3rd》笔记(3.15):字符串转换为日期

    字符串转换为日期 问题 你的应用程序接受字符串格式的输入,但是你想将它们转换为 datetime 对象以便在上面执行非字符串操作. 解法 使用 Python 的标准模块 datetime 可以很容易的 ...

最新文章

  1. 【英语学习】【WOTD】incipient 释义/词源/示例
  2. 考研过程中最容易犯的八大错误
  3. 利用shell找出15分钟内修改的文件
  4. 什么是HotSpot VM 深入理解Java虚拟机 JVM
  5. 边缘计算中高效ML的EEoI
  6. java字节码查看器_jclasslib 64位
  7. 一种可以自我修改的计算机器
  8. jsp 按照学号查找学生_​全国学籍号查询平台:https://my.chsi.com.cn/archive/index.jsp...
  9. 青岛,一座浓艳的美色之城?
  10. hashcat跑包小秘诀
  11. antV报错ResizeObserver loop limit exceeded
  12. 软件工程第一章绪论————(2019.12.27学习笔记)
  13. 单链表上的直接插入排序
  14. POJ 3621 Sightseeing Cows(最优比率环+spfa的dfs判环优化)
  15. 如何给table里的input赋值
  16. vue 3D轮播展示 --vue-carousel-3d
  17. linux 分析nginx日志,Linux Awk使用案例总结-nginx日志统计
  18. html中flash的用法,flash的用法总结大全
  19. 创始人专访 | Paul:听到自己的学员取得科研成功,是最大的幸福之一
  20. 三维图像高斯金字塔matlab,图像拼接中 高斯金字塔的建立 matlab程序详细解释 现金奖励...

热门文章

  1. 海量数据持久层解决方案_爱数AnyBackup重磅发布海量非结构化数据超可用解决方案...
  2. arcgis公里网格制作
  3. 神经网络与深度学习——TensorFlow2.0实战(笔记)(四)(python模块、包和库)
  4. 【转】.Net中的异步编程总结
  5. 【转】异步编程系列(Thread、Task、async/await、ajax等)
  6. 【转】OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service Client
  7. 第八节:Task的各类TaskTResult返回值以及通用线程的异常处理方案。
  8. php隐藏webshell_PHP 安全的十个必备技巧
  9. Qt中使用OpenSSL
  10. 【Python CheckiO 题解】The Most Wanted Letter