上一篇文章: 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