python list排序

本文深入探讨了 Python 中 List 的排序方法,包括 sort 方法和 sorted 函数,详细介绍了 cmp 参数、key 参数和 reverse 参数的作用,并通过多个实例展示了如何根据特定需求对 List 进行排序。同时,文章对比了不同排序方法的效率,最后讨论了多关键字排序及稳定排序的概念。

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

很多时候,我们需要对List进行排序,Python提供了两个方法
对给定的List L进行排序,
方法1.用List的成员函数sort进行排序
方法2.用built-in函数sorted进行排序(从2.4开始)
这两种方法使用起来差不多,以第一种为例进行讲解:
从Python2.4开始,sort方法有了三个可选的参数,Python Library Reference里是这样描述的
cmp:cmp specifies a custom comparison function of two arguments (iterable elements) which should return a negative, zero or positive number depending on whether the first argument is considered smaller than, equal to, or larger than the second argument:
"cmp=lambda x,y: cmp(x.lower(), y.lower())"
key:key specifies a function of one argument that is used to extract a comparison key from each list element: "key=str.lower"
reverse:reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed.In general, the key and reverse conversion processes are much faster than specifying an
equivalent cmp function. This is because cmp is called multiple times for each list element while key and reverse touch each element only once.

以下是sort的具体实例。

实例1:
>>>L = [2,3,1,4]
>>>L.sort()
>>>L
>>>[1,2,3,4]
实例2:
>>>L = [2,3,1,4]
>>>L.sort(reverse=True)
>>>L
>>>[4,3,2,1]
实例3:
>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>L.sort(cmp=lambda x,y:cmp(x[1],y[1]))
>>>L
>>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
实例4:
>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>L.sort(key=lambda x:x[1])
>>>L
>>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
实例5:
>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>import operator
>>>L.sort(key=operator.itemgetter(1))
>>>L
>>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
实例6:(DSU方法:Decorate-Sort-Undercorate)
>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>A = [(x[1],i,x) for i,x in enumerate(L)] #i can confirm the stable sort
>>>A.sort()
>>>L = [s[2] for s in A]
>>>L
>>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
以上给出了6中对List排序的方法,其中实例3.4.5.6能起到对以List item中的某一项
为比较关键字进行排序.
效率比较:
cmp < DSU < key
通过实验比较,方法3比方法6要慢,方法6比方法4要慢,方法4和方法5基本相当
多关键字比较排序:
实例7:
>>>L = [('d',2),('a',4),('b',3),('c',2)]
>>> L.sort(key=lambda x:x[1])
>>> L
>>>[('d', 2), ('c', 2), ('b', 3), ('a', 4)]
我们看到,此时排序过的L是仅仅按照第二个关键字来排的,如果我们想用第二个关键字
排过序后再用第一个关键字进行排序呢?有两种方法
实例8:
>>> L = [('d',2),('a',4),('b',3),('c',2)]
>>> L.sort(key=lambda x:(x[1],x[0]))
>>> L
>>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]
实例9:
>>> L = [('d',2),('a',4),('b',3),('c',2)]
>>> L.sort(key=operator.itemgetter(1,0))
>>> L
>>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]
为什么实例8能够工作呢?原因在于tuple是的比较从左到右比较的,比较完第一个,如果
相等,比较第二个
<think>好的,我现在需要帮用户解答关于Python列表排序的问题。首先,我应该回忆一下Python中列表排序的常用方法,主要有两种:使用列表的sort()方法和内置的sorted()函数。这两个有什么区别呢?sort()是原地排序,会改变原列表,而sorted()会返回一个新列表,原列表不变。这点很重要,得在回答中说明清楚。 接下来,用户可能需要知道基本的排序用法,比如升序和降序。这时候要提到reverse参数,默认是False,升序;设置为True就是降序。例如,list.sort(reverse=True)或者sorted(list, reverse=True)。 然后,用户可能对自定义排序有需求,比如根据元素的某个属性或函数结果来排序。这时候需要介绍key参数。比如,按照字符串长度排序,可以用key=len;按照绝对值排序,key=abs。这个部分需要举例子,这样用户更容易理解。 另外,复杂对象的排序可能也是用户关心的,比如列表中的字典或者类实例。例如,根据字典的某个键值排序,或者类的某个属性排序。这时候同样可以用key参数,结合lambda函数来处理。比如,key=lambda x: x['age']。 还有稳定性问题,Python排序是稳定的,这点可能在多条件排序时有用。比如先按一个条件排序,再按另一个条件排序,而相同元素的相对位置保持不变。这时候可能需要分步骤排序,或者使用元组作为key来组合多个条件。 可能用户还会问到如何自定义比较函数,但在Python3中已经移除了cmp参数,需要使用functools.cmp_to_key来转换。这部分可能稍微高级一点,但如果有用户需要的话,应该简单提一下,并给出例子。 需要检查是否有遗漏的部分,比如列表的反转顺序,虽然可以用reverse参数,但也可以用[::-1]或者reverse()方法,不过这些不属于排序,而是反转。不过如果有用户混淆的话,可以稍微提一下区别。 另外,性能方面,Timsort算法是稳定的,适应性强,时间复杂度等等,可能用户不一定需要,但可以简要提到,说明Python排序的高效性。 还要注意语法正确,比如sort()是方法,调用时是list.sort(),而sorted()是函数,参数稍有不同。在举例的时候要确保代码正确,比如使用正确的参数名称,避免混淆。 可能用户会犯的错误,比如误以为sort()返回一个新列表,或者混淆了sorted()和sort()的用法。这时候需要在讲解时强调两者的区别,避免用户出错。 最后,结构要清晰,分点说明,先介绍基本用法,再讲关键参数,然后是复杂排序,最后可能的高级用法。每个部分用例子说明,这样用户更容易跟随。同时注意使用中文,语言简洁明了,避免专业术语过多,必要时解释术语。</think>在Python中,列表(`list`)的排序主要通过两种方式实现:**内置方法 `list.sort()`** 和**内置函数 `sorted()`**。以下是详细说明: --- ### 一、基本排序 #### 1. `list.sort()` 方法 - **原地排序**:直接修改原列表,返回值为`None`。 - **语法**: ```python list.sort(key=None, reverse=False) ``` - **示例**: ```python nums = [3, 1, 4, 1, 5, 9] nums.sort() print(nums) # 输出: [1, 1, 3, 4, 5, 9] ``` #### 2. `sorted()` 函数 - **生成新列表**:返回排序后的新列表,原列表不变。 - **语法**: ```python sorted(iterable, key=None, reverse=False) ``` - **示例**: ```python nums = [3, 1, 4, 1, 5, 9] sorted_nums = sorted(nums) print(sorted_nums) # 输出: [1, 1, 3, 4, 5, 9] ``` --- ### 二、控制排序顺序 通过 `reverse` 参数控制升序或降序: ```python # 降序排列 nums.sort(reverse=True) sorted(nums, reverse=True) ``` --- ### 三、自定义排序规则 使用 `key` 参数指定排序依据: #### 1. 按字符串长度排序 ```python words = ["apple", "banana", "cherry", "date"] words.sort(key=len) # 按长度升序 # 结果: ['date', 'apple', 'banana', 'cherry'] ``` #### 2. 按字典的值排序 ```python students = [ {"name": "Alice", "age": 20}, {"name": "Bob", "age": 18}, {"name": "Charlie", "age": 22} ] # 按年龄升序 sorted_students = sorted(students, key=lambda x: x["age"]) ``` #### 3. 多条件排序 通过返回元组实现多级排序: ```python # 先按年龄升序,年龄相同按姓名降序 sorted_students = sorted( students, key=lambda x: (x["age"], x["name"]), reverse=(False, True) ) ``` --- ### 四、复杂场景 #### 1. 类对象排序 若列表元素是自定义类的实例,需定义 `__lt__` 方法或通过 `key` 指定属性: ```python class Person: def __init__(self, name, age): self.name = name self.age = age people = [Person("Alice", 20), Person("Bob", 18)] # 按年龄排序 sorted_people = sorted(people, key=lambda p: p.age) ``` #### 2. 稳定性 Python排序是稳定的,相同键值的元素顺序保持不变: ```python data = [(2, "a"), (1, "b"), (2, "c")] sorted_data = sorted(data, key=lambda x: x[0]) # 结果: [(1, "b"), (2, "a"), (2, "c")] ``` --- ### 五、性能与原理 - **算法**:Python使用混合排序算法 **Timsort**,时间复杂度为 $O(n \log n)$,适合实际场景。 - **稳定性**:适用于需要保留相对顺序的多条件排序。 --- ### 六、常见问题 #### 1. `sort()` 和 `sorted()` 的区别? - `sort()` 修改原列表,`sorted()` 生成新列表。 #### 2. 如何反向排序? - 设置 `reverse=True`。 #### 3. 如何自定义比较函数? - 在Python3中需用 `functools.cmp_to_key`: ```python from functools import cmp_to_key def compare(a, b): return a - b # 自定义比较逻辑 sorted(nums, key=cmp_to_key(compare)) ``` --- 通过灵活使用 `key` 和 `reverse` 参数,可以覆盖绝大多数排序需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值