Weibw's World Weibw's World
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Weibw

一个没有梦想的咸鱼
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 《Flask》

  • 《Python Cookbook》第三版

    • 第一章:数据结构与算法

      • 解压序列赋值给多个变量
      • 解压可迭代对象赋值给多个变量
      • 保留最后 N 个元素
      • 查找最大或最小的 N 个元素
      • 实现一个优先级队列
      • 字典中的键映射多个值
      • 字典排序
      • 字典的运算
      • 查找两字典的相同点
      • 删除序列相同元素并保持顺序
      • 命名切片
      • 序列中出现次数最多的元素
      • 通过某个关键字排序一个字典列表
      • 排序不支持原生比较的对象
      • 通过某个字段将记录分组
        • 过滤序列元素
        • 从字典中提取子集
        • 映射名称到序列元素
        • 转换并同时计算数据
        • 合并多个字典或映射
      • 第二章:字符串和文本

      • 第三章:数字日期和时间

      • 第四章:迭代器与生成器

      • 第五章:文件与IO

      • 第六章:数据编码和处理

      • 第七章:函数

      • 第八章:类与对象

      • 第九章:元编程

      • 第十章:模块与包

      • 第十一章:网络与Web编程

      • 第十二章:并发编程

      • 第十三章:脚本编程与系统管理

      • 第十四章:测试、调试和异常

      • 第十五章:C语言扩展

    • Python基础

    • Python
    • 《Python Cookbook》第三版
    • 第一章:数据结构与算法
    weibw
    2021-12-20

    通过某个字段将记录分组

    # 问题

    你有一个字典或者实例的序列,然后你想根据某个特定的字段比如 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'},
    ]
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    现在假设你想在按 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)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    运行结果:

    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
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    # 讨论

    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)
    
    1
    2
    3
    4

    这样的话你可以很轻松的就能对每个指定日期访问对应的记录:

    >>> 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'}
    >>>
    
    1
    2
    3
    4
    5
    6

    在上面这个例子中,我们没有必要先将记录排序。因此,如果对内存占用不是很关 心,这种方式会比先排序然后再通过 groupby() 函数迭代的方式运行得快一些。

    编辑 (opens new window)
    #Python
    上次更新: 2023/10/13, 17:39:25
    排序不支持原生比较的对象
    过滤序列元素

    ← 排序不支持原生比较的对象 过滤序列元素→

    最近更新
    01
    牛客网非技术快速入门SQL练习题
    03-08
    02
    其他日常SQL题
    03-07
    03
    用户与权限管理
    03-05
    更多文章>
    Theme by Vdoing | Copyright © 2021-2023 | Weibw | 辽ICP备18015889号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式