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

    通过某个关键字排序一个字典列表

    # 问题

    你有一个字典列表,你想根据某个或某几个字典字段来排序这个列表。

    # 解决方案

    提示

    通过使用 operator 模块的 itemgetter 函数,可以非常容易的排序这样的数据结 构。

    假设你从数据库中检索出来网站会员信息列表,并且以下列的数据结构返回:

    rows = [
    	{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
    	{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
    	{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
    	{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
    ]
    
    1
    2
    3
    4
    5
    6

    根据任意的字典字段来排序输入结果行是很容易实现的,代码示例:

    from operator import itemgetter
    rows_by_fname = sorted(rows, key=itemgetter('fname'))
    rows_by_uid = sorted(rows, key=itemgetter('uid'))
    print(rows_by_fname)
    print(rows_by_uid)
    
    1
    2
    3
    4
    5

    代码的输出如下:

    [{'fname': 'Big', 'uid': 1004, 'lname': 'Jones'},
    {'fname': 'Brian', 'uid': 1003, 'lname': 'Jones'},
    {'fname': 'David', 'uid': 1002, 'lname': 'Beazley'},
    {'fname': 'John', 'uid': 1001, 'lname': 'Cleese'}]
    [{'fname': 'John', 'uid': 1001, 'lname': 'Cleese'},
    {'fname': 'David', 'uid': 1002, 'lname': 'Beazley'},
    {'fname': 'Brian', 'uid': 1003, 'lname': 'Jones'},
    {'fname': 'Big', 'uid': 1004, 'lname': 'Jones'}]
    
    1
    2
    3
    4
    5
    6
    7
    8

    itemgetter() 函数也支持多个 keys,比如下面的代码

    rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))
    print(rows_by_lfname)
    
    1
    2

    会产生如下的输出:

    [{'fname': 'David', 'uid': 1002, 'lname': 'Beazley'},
    {'fname': 'John', 'uid': 1001, 'lname': 'Cleese'},
    {'fname': 'Big', 'uid': 1004, 'lname': 'Jones'},
    {'fname': 'Brian', 'uid': 1003, 'lname': 'Jones'}]
    
    1
    2
    3
    4

    # 讨论

    在上面例子中,rows 被传递给接受一个关键字参数的 sorted() 内置函数。这个 参数是 callable 类型,并且从 rows 中接受一个单一元素,然后返回被用来排序的值。 itemgetter() 函数就是负责创建这个 callable 对象的。

    operator.itemgetter() 函数有一个被 rows 中的记录用来查找值的索引参数。可 以是一个字典键名称,一个整形值或者任何能够传入一个对象的 getitem() 方法 的值。如果你传入多个索引参数给 itemgetter() ,它生成的 callable 对象会返回一 个包含所有元素值的元组,并且 sorted() 函数会根据这个元组中元素顺序去排序。但 你想要同时在几个字段上面进行排序(比如通过姓和名来排序,也就是例子中的那样) 的时候这种方法是很有用的。

    itemgetter() 有时候也可以用 lambda 表达式代替,比如:

    rows_by_fname = sorted(rows, key=lambda r: r['fname'])
    rows_by_lfname = sorted(rows, key=lambda r: (r['lname'],r['fname']))
    
    1
    2

    注意

    这种方案也不错。但是,使用 itemgetter() 方式会运行的稍微快点。因此,如果 你对性能要求比较高的话就使用 itemgetter() 方式。 最后,不要忘了这节中展示的技术也同样适用于 min() 和 max() 等函数。

    比如:

    >>> min(rows, key=itemgetter('uid'))
    {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}
    >>> max(rows, key=itemgetter('uid'))
    {'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
    >>>
    
    1
    2
    3
    4
    5
    编辑 (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号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式