【Python Cookbook】S01E12 根据字段将记录分组

目录

  • 问题
  • 解决方案
  • 讨论

问题

如果有一系列的字典或对象实例,我们想根据某个特定的字段来分组迭代数据。

解决方案

假设有如下字典列表:

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'}
]

在对上述数据进行分组时,使用 itertools.groupby() 函数非常有用。
假设我们想以日期为分组的方式迭代显示数据,首先通过 operator.itemgetter() 函数进行排序,然后通过 itertools.groupby() 进行分组。

from operator import itemgetter
from itertools import groupby

rows.sort(key=itemgetter('date'))
for date, items in groupby(rows, key=itemgetter('date')):
    print(date)
    for i in items:
        print(' ', i)

产生结果如下:

在这里插入图片描述

讨论

函数 groupby() 通过扫描序列对相同值或者 key 指定的值进行分组。原理上,groupby() 创建了一个迭代器,每次迭代时返回一个值以及一个子迭代器,这个子迭代器会产生所有在该分组内具有该值的项。

需要注意的是,必须首先对字段根据需求进行排序,因为 groupby() 只能检查连续的项,不首先排序的话,将无法按照要求的方式进行分组。而反过来讲,如果只需要简单的按照日期将数据进行分组,那么使用 defaultdict() 即可:

from collections import defaultdict

rows_by_date = defaultdict(list)
for row in rows:
    rows_by_date[row['date']].append(row)

print(rows_by_date)

结果:

defaultdict(<class 'list'>, {
'07/01/2012': [{'address': '5412 N CLARK', 'date': '07/01/2012'}, {'address': '4801 N BROADWAY', 'date': '07/01/2012'}], 
'07/04/2012': [{'address': '5148 N CLARK', 'date': '07/04/2012'}, {'address': '1039 W GRANVILLE', 'date': '07/04/2012'}], 
'07/02/2012': [{'address': '5800 E 58TH', 'date': '07/02/2012'}, {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'}, {'address': '1060 W ADDISON', 'date': '07/02/2012'}], 
'07/03/2012': [{'address': '2122 N CLARK', 'date': '07/03/2012'}]})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/673619.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

----JAVA 继承----

引言 再java中你能创造出很多的类&#xff0c;但如果这些类中的成员再另一个类中也要使用&#xff0c;那么就要用到继承来实现指定类中成员的使用了 那么也就可以写出这样的代码 再类Cat中使用了类Animal的成员&#xff0c;这里我们称Cat叫子类&#xff0c;Animal叫父类 概念…

上位机图像处理和嵌入式模块部署(f407 mcu中tf卡读写和fatfs挂载)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很早之前&#xff0c;个人对tf卡并不是很重视&#xff0c;觉得它就是一个存储工具而已。后来在移植v3s芯片的时候&#xff0c;才发现很多的soc其实…

蓝奏管理器iapp源码V3

蓝奏登录注册&#xff0c;简单管理文件夹等都没问题&#xff0c;就是上传接口需要有能力的人抓包进行修复一下&#xff08;我留了之前还能正常使用的接口&#xff0c;也是蓝奏官方的&#xff0c;所以参照一下就行。&#xff09;&#xff0c;这个应该也不是什么大问题&#xff0…

IDEA 学习之 命令行太长问题

现象 Error running App Command line is too long. In order to reduce its length classpath file can be used. Would you like to enable classpath file mode for all run configurations of your project?解决办法 办法一 .idea\workspace.xml ——> <compone…

【图自动编码器】基础介绍 及 基于PyTorch的图自动编码器实例代码 | MLP应用于节点级别和图级别的任务实例(附实例代码+数据集)

世界以痛吻我,我要报之以歌。——泰戈尔 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域TOP4🌟 🏅[4] 阿里云社区特邀专家博主🏅

秋招突击——算法打卡——5/31——复习{采药问题、(状态压缩DP)小国王}——新做:{盛最多水的容器、整数转罗马数字}

文章目录 复习背包模型——采药问题状态压缩DP——小国王思路分析实现代码参考 新作盛最多的水个人实现思路分析实现代码 参考分析思路分析实现思路 整数转罗马数字个人实现思路分析实现代码 参考实现思路分析实现代码 总结 复习 背包模型——采药问题 原题链接这里回忆的时候…

回溯算法之简单组合

哦吼&#xff01;今天结束了二叉树&#xff0c;开始回溯算法 其实也需要用到迭代&#xff0c;哈哈哈哈&#xff0c;但是这个暴力穷举真的好爽。 先记一下回溯算法的基本框架吧 老规矩&#xff1a; 还是有结束条件 但是后面就不太一样了 这里就是for循环&#xff0c;循环n…

系统思考的魅力

“不管你信不信&#xff0c;你的系统正是为了现在这个结果而设计的。”—爱德华兹戴明 在长期的组织辅导中&#xff0c;最开始我常听到管理者们说&#xff1a;“这是某某的问题”&#xff0c;或者“某某真不行”。我想这也正显示出系统思考的真正魅力&#xff0c;当大家开始用…

小波相干性显著性检验(MATLAB R2018A)

交叉小波常被用于检测不同信号之间的相关性&#xff0c;其在时频域建立了不同信号之间的联系。对于两个时域信号&#xff0c;其交叉小波变换和交叉小波尺度谱如下&#xff1a; 以轴承振动信号为例&#xff0c;利用正常轴承与故障轴承的振动信号、故障轴承和故障轴承的振动信号分…

使用conda环境安装pythonocc-core

conda环境安装pythonocc库 基本环境 操作系统:Ubuntu 22.04 conda 23.11.0 安装pythonocc-core conda create --name pyocc python3.10 conda activate pyocc conda install -c conda-forge pythonocc-core7.8.1也可参考下面的官方地址 pythonocc-core 官方git地址 conda官…

Golang | Leetcode Golang题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; func longestConsecutive(nums []int) int {numSet : map[int]bool{}for _, num : range nums {numSet[num] true}longestStreak : 0for num : range numSet {if !numSet[num-1] {currentNum : numcurrentStreak : 1for numSet[currentNum…

第4章:车辆的横向优化控制

4.1 车辆动力学模型 注1&#xff1a;运动学模型和动力学模型最大的不同点在于 运动学模型是在我们不考虑车辆的受力情况下建立的&#xff08;回顾我们推导出运动学模型的过程&#xff0c;我们没有使用到任何车辆所受的外力作为公式中的已知量&#xff0c;而是直接通过 “ 车速…

力扣173题:二叉搜索树迭代器(含模拟面试)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业…

OBS实现多路并发推流

OBS实现多路并发推流 解决方案速览相关依赖下载安装多路推流 解决方案速览 利用OBS进行本地直播画面的构建。 使用Multiple RTMP outputs plugin进行多路并发推流。 相关依赖下载安装 OBS软件 # OBS官网 https://obsproject.com/zh-cnMultiple RTMP outputs plugin # 插件官网…

【TB作品】MSP430 G2553 单片机口袋板,流水灯,按键改变花型

功能 按键修改流水灯的花型&#xff0c;一共四种花型。 效果 部分代码 while (1){PinIN();I2C_IODect(); /*按键检测处理 */delay_ms(20);time;if (time > 6){time 0;if (mode 0){index;if (index > 7){index 0;}PinOUT(0, 1); /* 指定0号管脚输出为0 */PinOUT(1, 1)…

视觉盛宴:探索大屏UI设计的卓越美学

视觉盛宴&#xff1a;探索大屏UI设计的卓越美学 在数字时代&#xff0c;用户界面&#xff08;UI&#xff09;设计不仅仅是功能性的体现&#xff0c;更是美学与技术融合的艺术。大屏UI设计&#xff0c;以其独特的视觉冲击力和交互体验&#xff0c;为用户带来了前所未有的视觉盛…

【Web API DOM03】事件监听

一&#xff1a;什么是事件监听 指程序检测有无某一事件发生&#xff0c;如果发生&#xff0c;就调用一个函数做出反应&#xff1b;也称为绑定事件或注册事件 比如鼠标经过显示下拉菜单、点击侧边栏播放轮播图 二&#xff1a;怎么用事件监听 1 语法规范&#xff1a; 元素对…

node.js安装步骤

系统重装node.js&#xff0c;记录一下步骤。 我的项目使用的版本是v14.13.0&#xff0c;到官网下载一下二进制压缩包。 下载完成后&#xff0c;解压压缩包到自己想要的路径。然后进行环境变量设置。 经过这两步以后&#xff0c;使用控制台就可以查看node的版本了。

随心笔记,第五更

目录 脚本代码 启动方式 开机自启 1、打开“任务计划程序”&#xff1a; 2、创建基本任务&#xff1a; 3、触发任务&#xff1a; 4、执行任务&#xff1a; 5、编辑任务&#xff1a; 6、完成设置&#xff1a; 手动启动 示例代码&#xff08;Python脚本自启&#xff0…

算法每日一题(python,2024.06.02)

题目来源&#xff1a;&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;简单&#xff09; 解题思路&#xff1a; 用lower()函数转换为小写&#xff08;也可以用upper()函数全部变为大写&#xff09;&#xff0c;用isalnum()函数去除非字母数字字符&#…