当前位置: 首页 > news >正文

sorted() 的 key 必须是可调用对象(callable),它会被 sorted() 调用,返回排序依据

是的,sorted()key 参数必须传入一个可调用对象(callable),这个 callable 负责计算每个元素的“排序依据”。


📌 为什么 key 需要是一个 callable?

Python 的 sorted() 需要对列表中的每个元素调用 key 指定的函数,获取排序的“权重”。它的执行流程如下:

  1. 遍历列表中的每个元素
  2. 调用 key 指定的函数,获取排序依据(排序权重)。
  3. 按照排序依据对列表排序

✅ 示例 1:key 需要是一个 callable

❌ 错误示范

students = [
    {"name": "Alice", "score": 85},
    {"name": "Bob", "score": 92},
    {"name": "Charlie", "score": 78}
]

sorted(students, key=students[0]['score'])  # ❌ 错误!

❌ 报错

TypeError: 'int' object is not callable

原因

  • students[0]['score']85它是一个整数,不是一个函数
  • sorted() 期望 key 传入一个函数,而 85 不是函数,导致报错。

✅ 正确的写法

方法 1:使用 lambda

sorted(students, key=lambda s: s['score'])

🔹 解释

  • lambda s: s['score'] 是一个函数,它接收 s(即列表中的一个元素),返回 s['score'] 作为排序依据。

方法 2:使用 operator.itemgetter()

from operator import itemgetter

sorted(students, key=itemgetter('score'))

🔹 解释

  • itemgetter('score') 返回一个函数,它的作用和 lambda s: s['score'] 相同,但性能更优。

✅ 证明 key 需要是 callable

让我们用 print() 观察 key 的调用过程:

students = [
    {"name": "Alice", "score": 85},
    {"name": "Bob", "score": 92},
    {"name": "Charlie", "score": 78}
]

def key_function(s):
    print(f"调用 key_function 处理: {s}")
    return s['score']

sorted_students = sorted(students, key=key_function)

✅ 输出

调用 key_function 处理: {'name': 'Alice', 'score': 85}
调用 key_function 处理: {'name': 'Bob', 'score': 92}
调用 key_function 处理: {'name': 'Charlie', 'score': 78}

🔍 观察

  • sorted() 会对列表中的每个元素调用 key_function(),以获取排序依据。
  • sorted() 只接受可调用对象作为 key,否则会报错。

🎯 结论

  • sorted()key 必须是可调用对象(callable),它会被 sorted() 调用,返回排序依据。
  • 不能传入具体的值(如 students[0]['score']),因为 sorted() 期望一个可以调用的函数,而不是一个单独的数值。
  • 推荐 lambdaitemgetter(),都能正确提供 callable。

📌 最后复习

错误

sorted(students, key=students[0]['score'])  # ❌ key 不能是一个数值

正确

sorted(students, key=lambda s: s['score'])  # ✅ key 是一个函数
sorted(students, key=itemgetter('score'))  # ✅ 更高效的写法
http://www.dtcms.com/a/22450.html

相关文章:

  • 【Excel笔记_6】条件格式和自定义格式设置表中数值超过100保留1位,超过1000保留0位,低于100为默认
  • Linux上部署Java项目-通过sh脚本启动
  • 机器学习——支持向量机
  • 深度学习实战——卷积神经网络CNN在图片识别中的应用以及原理
  • 如何在 Mac 上下载安装仙剑游戏仙剑世界?可以通过IPA砸壳包安装非常简单
  • Dify搭建旅行规划助手
  • 基于时变天气网络的无人机群配送路径优化
  • .NET + Vue3 的前后端项目在IIS的发布
  • WordPress“更新失败,响应不是有效的JSON响应”问题的修复
  • 基于Open Babel将SDF转为MOL2格式
  • 前端带样式导出excel表格,html表格生成带样式的excel表格
  • PHP 文件与目录操作
  • gitte远程仓库修改后,本地没有更新,本地与远程仓库不一致
  • Ubuntu虚拟机NDK编译ffmpeg
  • 【Java】理解字符串拼接与数值运算的优先级
  • 解压包格式7z怎么解压?8种方法(Win/Mac/手机/网页端)
  • C++核心指导原则: 哲学部分
  • Deepseek-R1推理模型API接入调用指南 ChatGPT Web Midjourney Proxy 开源项目接入Deepseek教程
  • Linux 信号量
  • Python的那些事第二十四篇:Tornado:异步网络编程的“风火轮”
  • 【实战项目】BP神经网络识别人脸朝向----MATLAB实现
  • 蓝桥杯平方差(打表)
  • React创建项目实用教程
  • 使用DeepSeek建立一个智能聊天机器人0.11
  • 执行pnpm run dev报错:node:events:491 throw er; // Unhandled ‘error‘ event的解决方案
  • leetcode - hot100 - python - 专题一:哈希
  • 基于STM32、HAL库、MB85RC16PNF(I2C接口)驱动程序设计
  • python实现jaccard系数得出两个集合的相似度
  • deepseek-r1不同参数量的模型本地私有化部署,需要的硬件资源最低配置
  • [vs2017][qt]MSB4019 未找到导入的项目QtMsBuild\Qt.prop