Python列表排序有两种方法:list.sort()原地修改列表并返回None,适用于无需保留原列表的场景;sorted()函数返回新列表,不改变原始数据,适合需保留原序或处理不可变对象的情况。两者均使用稳定的Timsort算法,默认升序排列,支持通过key参数自定义排序规则(如按长度、属性或字典值),reverse=True可实现降序。选择取决于是否需保留原列表及内存使用考量,性能差异主要体现在sorted()有额外的内存开销。

Python对列表进行排序主要有两种核心方法:一种是列表对象自带的
sort()
sorted()
要对Python列表进行排序,最直接有效的方式就是利用其内建的排序机制。这两种机制各有侧重,但都提供了强大的自定义能力。
list.sort()
None
sort()
my_list = [3, 1, 4, 1, 5, 9, 2, 6]
print(f"原始列表: {my_list}") # 原始列表: [3, 1, 4, 1, 5, 9, 2, 6]
my_list.sort()
print(f"使用sort()后: {my_list}") # 使用sort()后: [1, 1, 2, 3, 4, 5, 6, 9]
# 降序排序
another_list = [8, 0, 7, 2, 5]
another_list.sort(reverse=True)
print(f"降序排序后: {another_list}") # 降序排序后: [8, 7, 5, 2, 0]而
sorted()
立即学习“Python免费学习笔记(深入)”;
original_data = [('apple', 3), ('banana', 1), ('cherry', 2)]
print(f"原始数据: {original_data}") # 原始数据: [('apple', 3), ('banana', 1), ('cherry', 2)]
# 默认排序(按元组的第一个元素)
sorted_data = sorted(original_data)
print(f"使用sorted()后: {sorted_data}") # 使用sorted()后: [('apple', 3), ('banana', 1), ('cherry', 2)]
# 降序排序
reverse_sorted_data = sorted(original_data, reverse=True)
print(f"使用sorted()降序后: {reverse_sorted_data}") # 使用sorted()降序后: [('cherry', 2), ('banana', 1), ('apple', 3)]
# 原始数据未改变
print(f"原始数据依然: {original_data}") # 原始数据依然: [('apple', 3), ('banana', 1), ('cherry', 2)]无论是
sort()
sorted()
key
reverse
key
在Python中,如果只是简单地对数字或字符串进行升序或降序排列,默认行为通常就够用了。但现实世界的数据往往更复杂,比如你可能有一堆学生对象,需要按年龄排序,或者一堆文件名,需要按文件大小排序。这时候,
key
key
key
举几个例子来说明:
按字符串长度排序:
假设你有一个字符串列表,想根据每个字符串的长度来排序,而不是按字母顺序。
words = ["apple", "banana", "kiwi", "grapefruit", "cat"]
# 默认排序是按字母顺序
print(f"默认排序: {sorted(words)}") # 默认排序: ['apple', 'banana', 'cat', 'grapefruit', 'kiwi']
# 按长度排序
print(f"按长度排序: {sorted(words, key=len)}") # 按长度排序: ['cat', 'kiwi', 'apple', 'banana', 'grapefruit']这里
len
key
sorted()
按自定义对象属性排序:
如果你有一个自定义类的实例列表,比如学生对象,每个学生有姓名和分数。
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
def __repr__(self): # 为了方便打印
return f"Student({self.name}, {self.score})"
students = [
Student("Alice", 90),
Student("Bob", 85),
Student("Charlie", 92),
Student("David", 85)
]
# 按分数排序
# 这里使用lambda函数,它是一个匿名函数,用于快速定义一个简单的key
sorted_by_score = sorted(students, key=lambda student: student.score)
print(f"按分数排序: {sorted_by_score}")
# 输出: [Student(Bob, 85), Student(David, 85), Student(Alice, 90), Student(Charlie, 92)]
# 如果分数相同,我们可能还想按姓名排序。这就涉及多级排序,但`key`只处理一级。
# 要实现多级排序,可以返回一个元组作为key,Python会按元组元素的顺序进行比较
sorted_by_score_then_name = sorted(students, key=lambda student: (student.score, student.name))
print(f"按分数再按姓名排序: {sorted_by_score_then_name}")
# 输出: [Student(Bob, 85), Student(David, 85), Student(Alice, 90), Student(Charlie, 92)]
# 注意:这里Bob和David分数相同,但Bob在David之前,因为'B'在'D'之前。通过
lambda student: student.score
score
lambda student: (student.score, student.name)
按字典中的特定键值排序:
data = [
{'name': 'John', 'age': 30, 'city': 'New York'},
{'name': 'Jane', 'age': 25, 'city': 'London'},
{'name': 'Mike', 'age': 35, 'city': 'Paris'}
]
# 按年龄排序
sorted_by_age = sorted(data, key=lambda item: item['age'])
print(f"按年龄排序: {sorted_by_age}")
# 输出: [{'name': 'Jane', 'age': 25, 'city': 'London'}, {'name': 'John', 'age': 30, 'city': 'New York'}, {'name': 'Mike', 'age': 35, 'city': 'Paris'}]key
关于Python列表的排序方向,默认情况下,无论是
list.sort()
sorted()
reverse
reverse
reverse=False
reverse=True
numbers = [10, 5, 8, 3, 12]
print(f"默认升序: {sorted(numbers)}") # 默认升序: [3, 5, 8, 10, 12]
print(f"降序: {sorted(numbers, reverse=True)}") # 降序: [12, 10, 8, 5, 3]另一个非常重要且经常被忽视的特性是排序算法的稳定性。Python的排序算法是稳定的。这意味着什么呢?如果列表中有两个或多个元素,它们在排序时被判断为“相等”(即它们的
key
这个特性在很多时候都至关重要,尤其是在进行多级排序时。举个例子,假设你有一份员工列表,你先按部门排序,然后你希望在每个部门内部,员工再按加入公司的时间排序。如果排序算法不稳定,那么你第二次按时间排序时,部门内部的员工顺序可能会被打乱,导致最终结果不符合预期。
Python使用一种名为 Timsort 的混合排序算法,它结合了归并排序和插入排序的优点。Timsort不仅效率高(平均和最坏情况都是O(n log n)),而且它就是一种稳定的排序算法。
我们来看一个稳定性示例:
data = [('apple', 3), ('banana', 1), ('cherry', 2), ('date', 1)]
# 假设我们想按元组的第二个元素排序,但希望当第二个元素相同时,保持原始顺序。
# 这里 'banana' 和 'date' 的第二个元素都是1。在原始列表中,'banana' 在 'date' 之前。
# 使用key按第二个元素排序
sorted_data = sorted(data, key=lambda item: item[1])
print(f"按第二个元素排序: {sorted_data}")
# 输出: [('banana', 1), ('date', 1), ('cherry', 2), ('apple', 3)]
# 注意:'banana' 依然在 'date' 之前,这证明了排序的稳定性。很多时候,我们可能没意识到排序的“稳定性”有多重要,直到遇到需要多级排序的复杂场景,Timsort的这个特性就显得尤为贴心了。它省去了我们很多额外处理同值元素的麻烦,让数据处理逻辑更加清晰。
list.sort()
sorted()
选择
list.sort()
sorted()
什么时候用 list.sort()
sort()
sort()
sort()
None
None
my_large_list = list(range(1000000, 0, -1)) # 一个很大的倒序列表 # 如果只关心排序后的结果,不关心原始列表,且内存敏感 my_large_list.sort() # 原地修改,内存开销小
什么时候用 sorted()
sorted()
sorted()
sorted()
my_tuple = (5, 2, 8, 1)
sorted_list_from_tuple = sorted(my_tuple) # 返回新列表,元组不变
print(f"排序后的列表: {sorted_list_from_tuple}") # [1, 2, 5, 8]
print(f"原始元组: {my_tuple}") # (5, 2, 8, 1)
my_dict = {'b': 2, 'a': 1, 'c': 3}
sorted_keys = sorted(my_dict.keys()) # 排序字典的键
print(f"排序后的键: {sorted_keys}") # ['a', 'b', 'c']排序性能有区别吗?
从时间复杂度的角度来看,
list.sort()
sorted()
然而,
sorted()
list.sort()
但话说回来,我见过不少新手掉进
my_list = my_list.sort()
None
None
sorted()
所以,选择哪个,更多是根据你的业务逻辑和对数据是否需要保持原样的需求来决定。性能差异通常不是首要考虑因素,除非你正在处理的数据量大到足以让这些微小的差异变得重要。正确理解它们的行为和适用场景,远比纠结那一点点性能差异更有价值。
以上就是python怎么对列表进行排序_python列表排序方法详解的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号