Python通过公共键对字典列表排序

  • 根据一个或多个字典中的值来对列表排序
users = [
    {'name':'jack','age':25,'height':180},
    {'name':'amor','age':23,'height':177},
    {'name':'niko','age':45,'height':169},
    {'name':'lops','age':20,'height':168},
    {'name':'fdop','age':33,'height':189},
    {'name':'bon','age':22,'height':168},
    {'name':'rom','age':26,'height':166},
    {'name':'gogo','age':18,'height':177},
]
# 通过公共列age排序,反序的话添加reversed=True
sort_by_age = sorted(users,key=lambda x:x['age'])
print(sort_by_age)

# 输出
[{'name': 'gogo', 'age': 18, 'height': 177},
 {'name': 'lops', 'age': 20, 'height': 168},
 {'name': 'bon', 'age': 22, 'height': 168},
 {'name': 'amor', 'age': 23, 'height': 177},
 {'name': 'jack', 'age': 25, 'height': 180},
 {'name': 'rom', 'age': 26, 'height': 166},
 {'name': 'fdop', 'age': 33, 'height': 189},
 {'name': 'niko', 'age': 45, 'height': 169}]

operator模块中的itemgetter

itemgetter()通常要比lambda要快一些

from operator import itemgetter
sort_by_age = sorted(users,key=itemgetter('age'))
# 结果和上面完全一样

# 接受多个
by_height_age = sorted(users,key=itemgetter('height','age'))
print(by_height_age)
# 输出
[{'name': 'rom', 'age': 26, 'height': 166},
 {'name': 'lops', 'age': 20, 'height': 168},  # height相同再通过age排序
 {'name': 'bon', 'age': 22, 'height': 168},
 {'name': 'niko', 'age': 45, 'height': 169},
 {'name': 'gogo', 'age': 18, 'height': 177}, 
 {'name': 'amor', 'age': 23, 'height': 177}, 
 {'name': 'jack', 'age': 25, 'height': 180}, 
 {'name': 'fdop', 'age': 33, 'height': 189}]
  • 同样也支持maxmin函数
# 获取height最大的
max(users,key=itemgetter('age'))
  • 取出序列中的前几个或后几个

heapq模块中的nlargestnsmallest

from heapq import nlargest,nsmallest
from operator import itemgetter

# 简单序列
nums = [21,1,546,6,269,236,344,56,3]

# 最大三个
print(nlargest(3,nums))

# 最小三个
print(nsmallest(3,nums))

# 输出
[546, 344, 269]
[1, 3, 6]


# 复杂序列,就用上面的users

# 年龄最大三人
# sort_age = nlargest(3,users, key=lambda a: a['age'])
sort_age = nlargest(3,users, key=itemgetter('age'))
print(sort_age)

# 最矮三人
sort_height = nsmallest(3, users, key=itemgetter('height'))
print(sort_height)

# 输出
[{'name': 'niko', 'age': 45, 'height': 169},
 {'name': 'fdop', 'age': 33, 'height': 189},
 {'name': 'rom', 'age': 26, 'height': 166}]

[{'name': 'rom', 'age': 26, 'height': 166},
 {'name': 'lops', 'age': 20, 'height': 168},
 {'name': 'bon', 'age': 22, 'height': 168}]

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 迭代对象解压赋值 解压赋值操作可以应用到任何迭代对象上,如:列表、元组、字符串、文件对象、迭代器、生成器。 ...
    faris_shi阅读 1,140评论 0 0
  • 本文内容整理自《Python Cookbook》,仅用作本人学习笔记,若侵犯原著权益请尽快联系本人。 1.将序列分...
    openex阅读 404评论 0 0
  • 数据结构和算法 通过*表达式或者是一个用不到的变量来拆分,处理序列 使用 _ 符号舍弃序列中不需要的值 使用 * ...
    buildbody_coder阅读 287评论 0 0
  • 第一章 数据结构与算法 0.保留最后的n个元素。 主要是collections.deque,提供了两端都可以操作的...
    董小贱阅读 370评论 0 1
  • 重庆游结束了^_^ 第三天我们准备回长沙了,计划是去去买点重庆特产火锅料带给亲戚朋友们。 早上去花市豌杂面吃了早餐...
    lt甜阅读 166评论 0 0