首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第7章 编程术语
7.1 编程术语定义
7.1.1 作为语言的Python和作为解释器的Python
7.1.2 垃圾回收
7.1.3 字面量
7.1.4 关键字
7.1.5 对象、值、实例和身份
7.1.6 项
7.1.7 可变和不可变
7.1.8 索引、键和哈希值
7.1.9 容器、序列、映射和集合类型
7.1.10 特殊方法
7.1.11 模块和包
7.1.12 可调用对象和头等对象
7.2 经常被混淆的术语
7.2.1 语句和表达式
7.2.2 块、子句和主体
7.2.3 变量和特性
7.2.4 函数和方法
7.2.5 可迭代对象和迭代器
7.2.6 语法错误、运行时错误和语义错误
7.2.7 形参和实参
7.2.8 显式类型转换和隐式类型转换
7.2.9 属性和特性
7.2.10 字节码和机器码
7.2.11 脚本和程序,以及脚本语言和编程语言
7.2.12 库、框架、SDK、引擎、API
第8章 常见的Python陷阱
8.1 循环列表的同时不要增删其中的元素
8.2 复制可变值时务必使用copy.copy()和copy.deepcopy()
8.3 不要用可变值作为默认参数
8.4 不要通过字符串连接创建字符串
8.5 不要指望sort()按照字母顺序排序
8.6 不要假设浮点数是完全准确的
8.7 不要使用链式!=运算符
8.8 不要忘记在仅有一项的元组中添加逗号
第9章 Python的奇特难懂之处
9.1 为什么256 是256,而257 不是257
9.2 字符串驻留
9.3 假的Python 增量运算符和减量运算符
9.4 传递空列表给all()
9.5 布尔值是整数值
9.6 链式使用多种运算符
9.7 Python 的反重力特性
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(三)
小册名称:Python编程轻松进阶(三)
### 8.5 不要指望`sort()`按照字母顺序排序 在Python编程的广阔天地中,`sort()`方法作为列表(List)的一个内置方法,被广泛用于对列表中的元素进行排序。然而,一个常见的误解是,许多初学者认为`sort()`方法总是按照字母顺序(对于字符串)或数值大小(对于数字)来排序列表。实际上,`sort()`方法的行为远比这复杂,其排序规则依赖于列表元素的类型以及可选的`key`参数。因此,本节将深入探讨`sort()`方法的排序机制,揭示为何不能简单地指望它总是按照字母顺序排序,并介绍如何通过`key`参数来控制排序行为。 #### 一、`sort()`方法的基本用法 首先,让我们回顾一下`sort()`方法的基本用法。`sort()`方法会就地(in-place)对列表进行排序,即直接修改原列表而不是返回一个新的排序后的列表。其基本语法如下: ```python list.sort(key=None, reverse=False) ``` - `key`参数是一个函数,用于从每个元素中提取一个用于比较的键。默认值为`None`,意味着直接比较元素本身。 - `reverse`是一个布尔值,用于指定排序的顺序。当`reverse=True`时,列表将按降序排列;默认为`False`,即按升序排列。 #### 二、为何`sort()`不总是按字母顺序排序 ##### 2.1 数字列表的排序 最直接的反例是当列表包含数字时。显然,数字列表不会按照字母顺序排序,而是按照数值大小排序。例如: ```python numbers = [3, 1, 4, 1, 5, 9, 2] numbers.sort() print(numbers) # 输出: [1, 1, 2, 3, 4, 5, 9] ``` ##### 2.2 自定义对象列表的排序 当列表包含自定义对象时,`sort()`方法的行为取决于这些对象的比较能力。如果对象没有实现比较方法(如`__lt__`, `__gt__`等),则直接排序会抛出`TypeError`。即使对象可比较,排序也是基于对象的某种属性或表示,而非简单地按字母顺序。 ##### 2.3 字符串中的非字母字符 对于包含非字母字符(如数字、空格、标点符号)的字符串列表,`sort()`方法会考虑这些字符的Unicode码点进行排序,而不是仅根据字母部分。这可能导致排序结果看起来不符合“字母顺序”的直观理解。 #### 三、使用`key`参数控制排序行为 为了更灵活地控制排序行为,Python提供了`key`参数。通过提供一个函数作为`key`参数的值,可以指定如何从每个元素中提取用于比较的键。这极大地扩展了`sort()`方法的适用性。 ##### 3.1 按字符串的特定部分排序 假设我们有一个包含人名的列表,但我们想根据每个人的姓氏来排序,而不是整个名字。此时,可以使用`lambda`函数作为`key`参数的值来提取姓氏并进行排序: ```python names = ["Alice Johnson", "Bob Smith", "Charlie Brown"] names.sort(key=lambda x: x.split()[-1]) print(names) # 输出: ['Bob Smith', 'Charlie Brown', 'Alice Johnson'] ``` ##### 3.2 忽略字符串中的大小写 默认情况下,`sort()`方法对字符串进行排序时区分大小写。为了忽略大小写,可以使用`str.lower`或`str.upper`作为`key`参数的值: ```python words = ["banana", "Apple", "Cherry"] words.sort(key=str.lower) print(words) # 输出: ['Apple', 'banana', 'Cherry'] ``` ##### 3.3 复杂对象的排序 对于包含复杂对象的列表,`key`参数允许我们根据对象的特定属性或计算结果进行排序。例如,假设我们有一个学生类,每个学生都有姓名和分数,我们想要根据分数来排序学生列表: ```python class Student: def __init__(self, name, score): self.name = name self.score = score students = [Student("Alice", 85), Student("Bob", 92), Student("Charlie", 78)] students.sort(key=lambda student: student.score, reverse=True) for student in students: print(f"{student.name}: {student.score}") # 输出(按分数降序): # Bob: 92 # Alice: 85 # Charlie: 78 ``` #### 四、总结 通过本节的讨论,我们了解到`sort()`方法并不总是按照字母顺序排序列表。其排序行为取决于列表元素的类型以及是否使用了`key`参数。对于包含非字母字符的字符串、数字列表或自定义对象列表,直接调用`sort()`可能不会得到预期的结果。通过合理利用`key`参数,我们可以实现更复杂、更灵活的排序逻辑,从而满足各种实际应用场景的需求。因此,在编写代码时,不要盲目指望`sort()`方法能自动按照字母顺序排序,而是要根据实际情况选择合适的排序策略和参数。
上一篇:
8.4 不要通过字符串连接创建字符串
下一篇:
8.6 不要假设浮点数是完全准确的
该分类下的相关小册推荐:
Python数据分析与挖掘实战(上)
Python合辑3-字符串用法深度总结
Python合辑5-格式化字符串
Python机器学习基础教程(上)
Python与办公-玩转PDF
Python3网络爬虫开发实战(下)
Python编程轻松进阶(四)
Python合辑8-变量和运算符
Python合辑13-面向对象编程案例(上)
实战Python网络爬虫
剑指Python(磨刀不误砍柴工)
Python合辑2-字符串常用方法