python的sort()方法详解

本文深入探讨了Python列表的排序方法,包括默认升序排序、降序排序以及使用key函数根据自定义规则排序。通过示例展示了key函数如何处理复杂排序,如根据元素距离、元组第二个元素进行排序,并介绍了lambda表达式的便捷用法,强调了其在排序中的作用。此外,还提及了在元组列表中利用key进行排序的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

>>> l1=[4,2,3,2,3,3,4,4,1,4]
>>> help(l1.sort)
Help on built-in function sort:

sort(*, key=None, reverse=False) method of builtins.list instance
    Sort the list in ascending order and return None.
    
    The sort is in-place (i.e. the list itself is modified) and stable (i.e. the
    order of two equal elements is maintained).
    
    If a key function is given, apply it once to each list item and sort them,
    ascending or descending, according to their function values.
    
    The reverse flag can be set to sort in descending order.

Google翻译

内置函数 sort 的帮助:

内置数据结构list 实例的 sort(*, key=None, reverse=False) 方法
     按升序对列表进行排序并返回 None。
    
     排序是就地的(即列表本身被修改)和稳定的(即保持两个相等元素的顺序)。
    
     如果给出了key函数,则将其应用于每个列表项并根据它们的函数值对它们进行升序或降序排序。
    
     可以将反向标志设置为按降序排序。

 

>>> l1=[4,2,3,2,3,3,4,4,1,4]#数据准备

>>> l1.sort()#默认情况下,即reverse=True,按照升序排列
>>> l1
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
>>> l1.sort(reverse=False)
>>> l1
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
>>> l1.sort(reverse=True)#令reverse=True,按照降序排列
>>> l1
[4, 4, 4, 4, 3, 3, 3, 2, 2, 1]

#将函数赋给key,然后将l1里的元素一一带入到key函数中,再根据key的返回值对l1里的元素进行排序
#函数准备
>>> def distance(x):
	'''函数的返回值是输入x与3的距离'''
	return abs(3-x)

>>> l1.sort(key=distance)
>>> l1
[3, 3, 3, 4, 4, 4, 4, 2, 2, 1]

>>> l1.sort(key=distance,reverse=True)
>>> l1
[1, 4, 4, 4, 4, 2, 2, 3, 3, 3]

下面这个例子完美的体现key的应用

#函数准备
>>> def pick(x):
	return x[1]

>>> pairs = [(4, 'four'),(1, 'one'),  (3, 'three'), (2, 'two')]
>>> pairs.sort()s#默认先按照元素的第一个由小到大排列
>>> pair
[(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]

#那我们如何根据元素的第二个元素进行排列呢?接下来就是体现key作用的时候到了
>>> pairs.sort(key=pick)
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

最后介绍一个小技巧:lambda关键字的应用,sort配合lambda使用,能充分发挥key的优势。

lambda只有一个功能,就是创建一个“简单”的无名函数,简单到只有输入和返回。其一般形式:

lambda 输入:返回

对应的def形式是

def 无函数名(输入):

   return 返回

就拿上面pick函数的例子来说,使用lambda表达式,只需一行代码就可以轻松实现排序

>>>pairs.sort(key=lambda x: x[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

 

<think>我们正在讨论Pythonsort()方法。用户要求详细解释sort()方法的使用。 注意:用户之前的问题是关于按位与运算,但当前问题已转向列表的sort()方法。因此,我们需要专注于sort()方法。 我们将涵盖以下内容: 1. sort()方法的基本用法(原地排序) 2. 参数:key(用于指定排序依据的函数)和reverse(是否逆序) 3. 与内置函数sorted()的区别 4. 排序稳定性 5. 复杂排序示例(如多级排序) 6. 注意事项(如不能比较不同类型的数据) 同时,我们将按照要求: - 行内数学表达式用$...$,独立公式用$$...$$ - 使用中文 - 生成相关问题 - 在引用处添加引用标识(但注意,由于我们当前没有外部引用,所以如果引用的是Python官方文档,可以标注[^1],但实际回答中我们可能没有具体引用来源,因此可以省略或使用通用标注) 由于用户要求详细,我们将分步骤解释并给出代码示例。</think>### Python `sort()` 方法详解 `sort()` 是 Python 列表的内置方法,用于**原地排序**列表元素(直接修改原列表,不返回新列表)。其核心功能是通过高效排序算法(通常是 Timsort[^1])对列表进行升序或降序排列。 #### 基础语法 ```python list.sort(key=None, reverse=False) ``` #### 核心参数详解 1. **`reverse`** (布尔值) - `False`(默认):升序排列(从小到大) - `True`:降序排列(从大到小) ```python nums = [3, 1, 4, 2] nums.sort() # [1, 2, 3, 4] nums.sort(reverse=True) # [4, 3, 2, 1] ``` 2. **`key`** (函数) 指定排序依据的函数,对每个元素应用函数后按返回值排序: ```python words = ["apple", "Banana", "cherry"] words.sort() # 默认按ASCII排序:['Banana', 'apple', 'cherry'] words.sort(key=str.lower) # 忽略大小写:['apple', 'Banana', 'cherry'] ``` #### 复杂排序场景 1. **多级排序** 使用元组实现多条件排序(优先级从左到右): ```python students = [ ("Alice", "B", 15), ("Bob", "A", 12), ("Charlie", "B", 12) ] # 先按年龄升序,再按班级升序 students.sort(key=lambda x: (x[2], x[1])) # 结果:[('Bob', 'A', 12), ('Charlie', 'B', 12), ('Alice', 'B', 15)] ``` 2. **自定义对象排序** 通过 `key` 指定对象属性: ```python class Product: def __init__(self, name, price): self.name = name self.price = price products = [Product("Pen", 3.5), Product("Book", 12.0)] products.sort(key=lambda p: p.price) # 按价格升序 ``` 3. **稳定排序特性** 当元素相等时,保持原始相对顺序: ```python data = [("A", 1), ("B", 1), ("C", 2)] data.sort(key=lambda x: x[1]) # 结果:[('A', 1), ('B', 1), ('C', 2)] - 相同值的'A'和'B'保持原序 ``` #### 与 `sorted()` 函数的区别 | 特性 | `sort()` | `sorted()` | |--------------|---------------------------|---------------------------| | **操作对象** | 列表方法 | 内置函数 | | **返回值** | 无(直接修改原列表) | 返回新排序列表 | | **原列表** | 被修改 | 保持不变 | | **适用性** | 仅列表 | 任意可迭代对象 | ```python # sorted() 示例 nums = [3, 1, 4] new_nums = sorted(nums) # 返回新列表 [1, 3, 4] print(nums) # 原列表不变 [3, 1, 4] ``` #### 性能与限制 1. **时间复杂度** - 平均和最坏情况:$O(n \log n)$ - 最佳情况(已排序):$O(n)$[^1] 2. **类型限制** 无法直接比较不同类型: ```python mixed = [1, "a"] mixed.sort() # TypeError: '<' not supported between 'int' and 'str' ``` #### 实用技巧 1. **逆序排序快捷方式** ```python lst = [1, 2, 3] lst.sort() lst.reverse() # 等效于 sort(reverse=True) ``` 2. **字典按值排序** ```python scores = {"Math": 90, "English": 85} sorted_items = sorted(scores.items(), key=lambda x: x[1], reverse=True) # [('Math', 90), ('English', 85)] ``` 3. **按字符串长度排序** ```python words = ["Python", "C", "JavaScript"] words.sort(key=len) # ['C', 'Python', 'JavaScript'] ``` #### 注意事项 - 仅适用于**可变列表**(元组不可用) - 对大型数据集优先使用 `key` 而非多次排序 - 自定义排序函数应返回可比较类型(数值/字符串) > Timsort 是结合归并排序和插入排序的混合算法,在 Python 中平均性能优于纯归并排序[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值