Python中的sort方法、sorted函数与lambda表达式
1. sort()方法
1.1 sort()方法
list.sort()最核心、也最需要记住的特点是:它会直接修改原始列表,使其变为有序状态。也就是原地排序。因此,sort()方法的返回值是None。部分初学者可能会将其结果赋值给新变量,这种用法是错误的。正确的用法是无需将其结果赋值给新变量,直接使用被修改后的原列表即可,如下所示:
1 | nums = [3, 1, 4, 1, 5, 9, 2] |
结果如下:
1 | [1, 1, 2, 3, 4, 5, 9] |
1.2 基本语法和参数
sort()方法的完整语法是:
1 | list.sort(*, key=None, reverse=False) |
它接受两个可自选的关键字参数:key和reverse。
A. reverse参数
这个参数非常直观
- reverse = False(默认值):升序排序
- reverse = True:降序排序
1 | numbers = [4, 2, 8, 1, 6] |
B. key参数
key参数是sort()方法最强大的功能。它允许你自定义排序的逻辑。
key接受一个函数(通常是lambda匿名函数)。在排序比较之前,列表中的每个元素都会先经过这个key函数处理,然后Python会根据这个函数的返回值来进行排序。
示例1:按字符串长度排序:
1 | words = ["apple", "banana", "kiwi", "cherry"] |
示例2:忽略大小写排序:
1 | names = ["Bob", "alice", "Charlie", "david"] |
示例3:按对象的属性排序(非常常用):
1 | people = [ |
当然也可以同时使用key和reverse:
1 | # 按年龄降序排序 |
2. sorted()函数
Python还提供了一个内置函数sorted(),它也用于排序。理解它们的区别至关重要。
list.sort() | sorted() | |
---|---|---|
类型 | 列表的方法(method) | 内置函数(function) |
使用对象 | 只能用于列表(list) | 可以用于任何可迭代对象(list, tuple, str, dict, etc.) |
修改 | 原地修改 | 不能修改原始对象,通常赋值给一个新的变量 |
返回值 | None | 返回一个新的、已排序的列表 |
2.1 代码对比
1 | # 使用 list.sort() |
3. lambda函数
一个lambda函数是一个小型的、匿名的、单行表达式函数。
3.1 基本语法
1 | lambda arguments: expression |
- lambda:关键字,表示你正在定义一个lambda函数。
- arguments:和普通函数的参数一样,可以有零个或多个,用逗号分割,也就是形参。
- expression:一个单独的表达式。计算这个表达式的结果,并作为函数的返回值。
3.2 lambda函数与普通函数的对比
A. 使用def(普通函数)
1 | def add(x, y): |
B. 使用lambda(匿名函数)
1 | add_lambda = lambda x, y: x + y |
3.3 lambda表达式的用法
lambda的主要用途是作为高阶函数的参数,
示例1:sorted函数和sort方法自定义排序规则
这是lambda最经典、最常见的用途。sorted函数和sort方法有一个key参数,你可以提供一个函数,sorted函数和sort方法会根据这个函数的返回值对元素进行排序。假设有一个元组列表,每个元组代表 (商品, 价格)。我们想按价格排序。
1 | items = [('apple', 2.5), ('banana', 1.8), ('cherry', 3.0)] |
key=lambda item: item[1]
创建了一个临时的、无需命名的函数,它接受一个item(元组),也就是items中的一个元素,并返回该元组的第二个元素(价格)。
其原理如下:
- sorted()函数开始工作,它拿到了
items
列表。 - 它需要对列表中的元素进行比较排序。它看到了
key=lambda item: item[1]
这个规则。 - 它取出第一个元素
('apple', 2.5)
。 - 它将这个元素传递给
lambda
函数,即item
参数现在是('apple', 2.5)
。 - lambda函数执行它的表达式
item[1]
,返回的结果是2.5。sorted()函数在内部记下:('apple', 2.5)
的排序值为2.5。 - 接着,它取出第二个元素
('banana', 1.8)
。 - 它将这个元素传递给lambda函数,
item
变成了('banana', 1.8)
。 - lambda函数执行
item[1]
,返回1.8。sorted()记下:('banana', 1.8)
的排序值为1.8”。 - 它取出第三个元素
('cherry', 3.0)
,同样地,通过lambda函数得到它的排序值为3.0。 - 最后,
sorted()
根据这些排序值[2.5, 1.8, 3.0]
来对原始的items
列表进行排序。1.8最小,2.5其次,3.0最大。 - 所以,最终返回的排序结果是:
[('banana', 1.8), ('apple', 2.5), ('cherry', 3.0)]
。
上面的例子是对价格进行升序排列,如果要进行降序排列可以这样写:
1 | items = [('apple', 2.5), ('banana', 1.8), ('cherry', 3.0)] |
如果要进行多级排序,可以这样写:
1 | # 列表中元组中元素的含义分别为名称、价格、重量 |
示例2:map()——对序列中的每个元素应用函数
1 | numbers = [1, 2, 3, 4, 5] |
示例3:filter()——筛选序列中的元素
1 | # 从序列中筛选出所有的偶数 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 星海流光!
评论