问题:根据某个或某几个字典字段来排序Python列表

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

eg:

  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.itemgetter()

  from operator import itemgetter

  1).print(rows_by_fname)

  >>>rows_by_fname = sorted(rows, key=itemgetter('fname'))

  >>>print(rows_by_fname)

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

  2).print(rows_by_uid) 

  >>>rows_by_uid = sorted(rows, key=itemgetter('uid'))

  >>>print(rows_by_uid)
  [{'fname': 'John', 'uid': 1001, 'lname': 'Cleese'},
  {'fname': 'David', 'uid': 1002, 'lname': 'Beazley'},
  {'fname': 'Brian', 'uid': 1003, 'lname': 'Jones'},
  {'fname': 'Big', 'uid': 1004, 'lname': 'Jones'}]

  3).itemgetter() 函数也支持多个keys

  itemgetter() 函数也支持多个keys,比如下面的代码
  >>>rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))
  >>>print(rows_by_lfname)

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

  在上面例子中,rows被传递给接受一个关键字参数的sorted()内置函数。

  这个参数是callable类型,并且从rows中接受一个单一元素,然后返回被用来排序的值。

  itemgetter()就是负责创建这个callable对象的。

  如果传多个参数给itemgetter(),它生成的callabe对象会返回一个包含所有值的元组,sort()函数会根据元组中元素顺序去排序。

  2.lambda表达式

    itemgetter()有时候可以用lambda表达式代替

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

    这种方案也不错。但是,使用itemgetter() 方式会运行的稍微快点。因此,如果
    你对性能要求比较高的话就使用itemgetter() 方式。

  3.min(),max()

    最后,不要忘了这节中展示的技术也同样适用于min() 和max() 等函数。比如:
    >>> min(rows, key=itemgetter('uid'))
    {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}
    >>> max(rows, key=itemgetter('uid'))
    {'fname': 'Big', 'lname': 'Jones', 'uid': 1004}

Python: 字典列表: itemgetter 函数: 根据某个或某几个字典字段来排序列表的更多相关文章

  1. Python的operator.itemgetter函数和sorted函数

    写这篇文章的目的是之前在<机器学习实战>用Python3实现KNN算法时用到的几个函数不太懂, 地址: 1- https://github.com/hitergelei/Self-Lear ...

  2. python中operator.itemgetter函数

    operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子. k = [,,] b = ) print(b(k)) #输 ...

  3. Python笔记(二):列表+列表数据处理+函数

    #才疏学浅,难免有不恰当之处,请不吝指正,谢谢. #适合初学者. 列表的数据自下而上堆放(形成一个堆栈),类似于其他编程语言的数组.例如: user = ["张三","李 ...

  4. python之itemgetter函数:对字典列表进行多键排序

    itemgetter函数:对字典列表进行多键排序 from operator import itemgetter list_people = [ {'name': 'Mike', 'age': 22, ...

  5. python中列表和字典常用方法和函数

    Python列表函数&方法 Python包含以下函数: 序号 函数 1 cmp(list1, list2)比较两个列表的元素 2 len(list)列表元素个数 3 max(list)返回列表 ...

  6. Python的字符串和列表和字典的方法/函数

    字符串 S.find()#可指定范围查找字串,返回索引值,否则返回-1 S.index()#同find,只是找不到的之后返回异常 S.count()#返回找到字串的个数 S.lower()#转小写 S ...

  7. python 小技巧(glob,guid,序列化,压缩字符,有序字典,sorted函数,分片)

    1.glob模块 glob模块是最简单的模块之一,内容非常少.用它可以查找符合特定规则的文件路径名.跟使用windows下的文件搜索差不多.查找文件只用到三个匹配符:”*”, “?”, “[]”.”* ...

  8. Python基础学习笔记(八)常用字典内置函数和方法

    参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-dictionary.html 3. http://www.lia ...

  9. python之列表作为函数的参数

    函数参数为 列表或者字典 传递一个列表,例如 [1, 2, 3] 将此传给函数get_sum() 求出 各个元素之和 传递一个字典,打印出key/value的对应关系表: #!/usr/bin/env ...

随机推荐

  1. 23种设计模式之命令模式(Command)

    命令模式是一种对象的行为型模式,类似于传统程序设计方法中的回调机制,它将一个请求封装为一个对象,从而使得可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是对命 ...

  2. java如何把文件转化成oracle的blob

    import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IO ...

  3. vue--循环列表

    <template> <div id="app"> <p v-for="x in list">{{x}}</p> ...

  4. SharePoint 2013 字段属性之JSLink

    在SharePoint 2013中,SPField新增加了一个属性是JSLink,使用客户端脚本修改字段前台展示,我们可以用很多方法修改这个脚本的引用,然后来修改脚本,下面,我们举一个简单的例子. 具 ...

  5. TFS二次开发09——查看文件历史(QueryHistory)

    这篇文章给大家展示怎样获取一个文件的历史版本,内容很简单,直接上代码了. string tpcURL = "http://127.0.0.1:8080/"; TfsTeamProj ...

  6. ELK之使用filebeat的多行过滤插件把多行合并成一行

    java运行日志一般有多行,格式类似如下 格式为:日期 + 日志级别 + 日志信息 有些日志是多行的,需要使用filebeat多行插件把多行合并成一行 未使用多行插件的日志格式 修改filebeat配 ...

  7. ubuntu16.04下安装Eigen

    请输入以下命令进行安装: sudo apt-get install libeigen3-dev 一个库由头文件和库文件组成.Eigen头文件的默认位置在 “usr/include/eigen3” 中. ...

  8. android stream media

    http://www.cnblogs.com/skyseraph/archive/2012/03/31/2427593.html http://www.cnblogs.com/lingyunhu/p/ ...

  9. Json模块dumps、loads、dump、load函数介绍

    转自:http://blog.csdn.net/mr_evanchen/article/details/77879967 Json模块dumps.loads.dump.load函数介绍 1.json. ...

  10. QS Network---zoj1586最小生成树

    Description Sunny Cup 2003 - Preliminary Round April 20th, 12:00 - 17:00 Problem E: QS Network In th ...