摘要:students = [ {"name": "小明", "score": 90}, {"name": "小红", "score": 85}, {"name": "小刚", "score": 92}]# 直接排序翻车!sorted_students = sort
最近收到很多初学者的提问:"为什么Python排序时,字典、字符串这些数据排起来总报错?"今天我们就用一个生活小妙招解决这个问题——排序神器key参数!
先看一个真实翻车现场
小明想给班级同学按成绩排序:
students = [ {"name": "小明", "score": 90}, {"name": "小红", "score": 85}, {"name": "小刚", "score": 92}]# 直接排序翻车!sorted_students = sorted(students) # 报错!系统提示:TypeError: '<' not supported between dict and dict
(字典和字典之间不能用
问题本质:
Python就像个认真的裁判,但面对字典时懵了:
"我是按名字比?还是按分数比?还是比字典厚度?"
一招解决:给裁判发"评分卡"
key参数就是给裁判的评分标准说明书!
students = [ {"name": "小明", "score": 90}, {"name": "小红", "score": 85}, {"name": "小刚", "score": 92}]# 告诉裁判:请按分数高低排序sorted_students = sorted( students, key=lambda student: student["score"], # 重点在这! reverse=True # 从高到低)print(sorted_students)运行结果:
[{'name': '小刚', 'score': 92}, {'name': '小明', 'score': 90}, {'name': '小红', 'score': 85}]✅
场景1️⃣:给文件名按后缀分组
files = ["报告.pdf", "歌曲.mp3", "图片.jpg"]sorted_files = sorted(files, key=lambda x: x.split(".")[-1])# 结果:['图片.jpg', '歌曲.mp3', '报告.pdf'] (按后缀名排)print(sorted_files)场景2️⃣:单词按长度排队
words = ["python", "java", "c++", "javascript"]sorted_words = sorted(words, key=len) # key=len 是绝配!# 结果:['c++', 'java', 'python', 'javascript'] (3→4→6→10字母)print(sorted_words)场景3️⃣:忽略大小写排英文
animals = ["Cat", "ant", "Bear", "bee"]sorted_animals = sorted(animals, key=str.lower)# 结果:['ant', 'Bear', 'bee', 'Cat'] (a,b,c不分大小写)print(sorted_animals)场景4️⃣:自定义对象按年龄排
class Student: def __init__(self, name, age): self.name = name self.age = age# 创建两个学生s1 = Student("小明", 18)s2 = Student("小红", 17)# 按年龄排序sorted_students = sorted([s1, s2], key=lambda s: s.age)# 结果:小红(17) → 小明(18)print([(s.name, s.age) for s in sorted_students])场景5️⃣:二维表格按指定列排序
grades = [ ["小明", 90, "北京"], ["小红", 85, "上海"], ["小刚", 92, "广州"]]# 按第2列(成绩)排序sorted_grades = sorted(grades, key=lambda x: x[1], reverse=True)# 结果:小刚(92) → 小明(90) → 小红(85)print(sorted_grades)场景6️⃣:中文按拼音排序
names = ["张三", "李四", "王五", "赵六"]sorted_names = sorted(names, key=lambda x: x.encode('gbk'))# 结果:['李四', '王五', '张三', '赵六'] (按拼音L→W→Z)print(sorted_names)两种写法任你选# 格式:key=lambda 临时变量: 你要提取的内容sorted(列表, key=lambda x: x[0]) # 取每个元素的第一个值sorted(列表, key=lambda book: book.price) # 取book对象的price属性写法2:先定义函数
def get_price(book): return book.price # 专门负责提取价格# 传函数名(不加括号!)sorted(books, key=get_price)避坑指南别把字典当字符串排
# 错误示范:直接排字典列表sorted(students) # 报错!# 正确姿势:必须用key指定比较依据sorted(students, key=lambda x: x["score"])key和reverse是好搭档
# key决定比什么,reverse决定方向sorted(students, key=lambda s: s.score, # 按分数 reverse=True) # 从高到低# 不推荐:排序时做复杂操作sorted(numbers, key=lambda x: x**2 + 2*x - 1)记住这个心法:
当Python不知道比什么时,就用key给它指条明路!
本文重点:
key不是修改数据,而是生成"排序指南"
lambda是最常用的快捷写法学起来!
避开字典排序的坑从此不报错✌️
来源:信息科技云课堂