Python实用技法第12篇:经过公共键对字典列表排序:itemgetter

上一篇文章: Python实用技法第11篇:找出序列中出现次数最多的元素
下一篇文章: Python实用技法第13篇:对自定义类对象排序:attrgetter

一、需求🙀

咱们有一个字典列表,想根据一个或多个字典中的值对列表进行排序。

二、解决方案😸

利用operator模块中的itemgetter函数对这类结构进行排序是很是简单的。segmentfault

  • 实例:
from operator import itemgetter
rows=[
{'name':'mark','age':18,'uid':'110'},
{'name':'miaomiao','age':28,'uid':'150'},
{'name':'miaomiao','age':8,'uid':'150'},
{'name':'xiaohei','age':38,'uid':'130'},
]

rows_by_name=sorted(rows,key=itemgetter('name'))
rows_by_uid=sorted(rows,key=itemgetter('uid'))
print(rows_by_name)
print(rows_by_uid)


#itemgetter还支持多个键
rows_by_name_age=sorted(rows,key=itemgetter('name','age'))
print(rows_by_name_age)

#itemgetter一样适用min、max
print(min(rows,key=itemgetter('uid')))
print(max(rows,key=itemgetter('age')))

运行结果:函数

[{'name': 'mark', 'age': 18, 'uid': '110'}, {'name': 'miaomiao', 'age': 28, 'uid': '150'}, {'name': 'miaomiao', 'age': 8, 'uid': '150'}, {'name': 'xiaohei', 'age': 38, 'uid': '130'}]
[{'name': 'mark', 'age': 18, 'uid': '110'}, {'name': 'xiaohei', 'age': 38, 'uid': '130'}, {'name': 'miaomiao', 'age': 28, 'uid': '150'}, {'name': 'miaomiao', 'age': 8, 'uid': '150'}]
[{'name': 'mark', 'age': 18, 'uid': '110'}, {'name': 'miaomiao', 'age': 8, 'uid': '150'}, {'name': 'miaomiao', 'age': 28, 'uid': '150'}, {'name': 'xiaohei', 'age': 38, 'uid': '130'}]
{'name': 'mark', 'age': 18, 'uid': '110'}
{'name': 'xiaohei', 'age': 38, 'uid': '130'}
  • 讨论

在这个例子中,rows被传递给内建的sorted()函数,该函数接受一个关键字参数key,这个参数应该表明一个可调用对象(callable),该对象从rows中接受一个单独的元素做为输入并返回一个用来作排序依据的值。itemgetter()函数建立的就是这样的一个可调用对象。性能

函数operator.itemgetter()接受的参数可做为查询的标记,用来从rows的记录中提取出所须要的值。它能够是字典的键名称、用数字表示的列表元素或是任何能够传给对象的__getitem__()方法的值。若是传多个标记给itemgetter(),那么它产生的可调用对象将返回一个包含全部元素在内的元组,而后sorted()将根据对元组的排序结果来排列输出结果。若是想同时针对多个字段作排序,那么这是很是有用的。ui

有时候会用lambda表达式取代itemgetter()的功能,例如:code

rows_by_uid=sorted(rows,key=lambda r:r['uid'])
rows_by_name_age=sorted(rows,key=lambda r:(r['name','age']))

这种解决方案一般也能正常工做。可是用itemgetter()一般会运行的更快一些。所以若是须要考虑性能问题的话,应该使用itemgetter().对象

上一篇文章: Python实用技法第11篇:找出序列中出现次数最多的元素
下一篇文章: Python实用技法第13篇:对自定义类对象排序:attrgetter
相关文章
相关标签/搜索