Python中列表排序主要用list.sort()和sorted(),前者原地修改列表并返回None,后者返回新列表不改变原列表;选择取决于是否需保留原顺序,结合key参数可实现灵活排序,且Python排序稳定,适用于复杂数据类型。

Python中对列表进行排序主要有两种核心方法:
list.sort()
sorted()
list.sort()
sorted()
在Python中,对列表进行排序是日常编程中非常常见的操作,无论是处理用户输入、数据分析还是算法实现,排序都扮演着重要角色。理解
list.sort()
sorted()
1. list.sort()
list.sort()
None
立即学习“Python免费学习笔记(深入)”;
语法:
list.sort(key=None, reverse=False)
key
reverse
True
False
示例:
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
print(f"原始列表: {numbers}")
numbers.sort() # 默认升序排序
print(f"使用 sort() 升序排序后: {numbers}")
numbers_desc = [3, 1, 4, 1, 5, 9, 2, 6]
numbers_desc.sort(reverse=True) # 降序排序
print(f"使用 sort() 降序排序后: {numbers_desc}")
words = ["banana", "Apple", "cherry", "Date"]
words.sort(key=str.lower) # 忽略大小写排序
print(f"使用 sort() 忽略大小写排序后: {words}")2. sorted()
sorted()
语法:
sorted(iterable, key=None, reverse=False)
iterable
key
list.sort()
key
reverse
list.sort()
reverse
示例:
data = (5, 2, 8, 1, 9) # 一个元组
print(f"原始元组: {data}")
sorted_list = sorted(data) # 返回一个新的列表
print(f"使用 sorted() 排序后的列表: {sorted_list}")
print(f"原始元组保持不变: {data}")
names = ["Charlie", "alice", "Bob"]
sorted_names = sorted(names, key=str.lower, reverse=True) # 忽略大小写降序
print(f"使用 sorted() 忽略大小写降序排序后的列表: {sorted_names}")
print(f"原始列表保持不变: {names}")sort()
sorted()
选择
list.sort()
sorted()
list.sort()
list.sort()
list.sort()
sort()
sort()
举个例子,假设你正在编写一个游戏,需要对一个包含数千个敌人的列表进行排序,以便找出最近的几个敌人。如果你每次都用
sorted()
sort()
key
key
以下是一些
key
根据对象属性排序: 当你有一个自定义对象列表时,
key
class Product:
def __init__(self, name, price, stock):
self.name = name
self.price = price
self.stock = stock
def __repr__(self): # 便于打印
return f"Product('{self.name}', ${self.price}, {self.stock} units)"
products = [
Product("Laptop", 1200, 50),
Product("Mouse", 25, 200),
Product("Keyboard", 75, 100),
Product("Monitor", 300, 30)
]
# 根据价格升序排序
sorted_by_price = sorted(products, key=lambda p: p.price)
print("按价格排序:", sorted_by_price)
# 根据库存降序排序
sorted_by_stock_desc = sorted(products, key=lambda p: p.stock, reverse=True)
print("按库存降序排序:", sorted_by_stock_desc)根据元组或列表的特定索引排序: 当列表包含元组或子列表时,你可以根据其中某个元素进行排序。
students = [
("Alice", 20, "A"),
("Bob", 22, "C"),
("Charlie", 20, "B"),
("David", 21, "A")
]
# 根据年龄排序
sorted_by_age = sorted(students, key=lambda s: s[1])
print("按年龄排序:", sorted_by_age)
# 结合 operator.itemgetter 进行多级排序(更高效)
from operator import itemgetter
# 先按年龄,再按成绩(成绩A > B > C)
# 注意:这里成绩是字符串,直接比较是按字母顺序,如果需要自定义成绩等级,key函数会更复杂
sorted_by_age_then_grade = sorted(students, key=itemgetter(1, 2))
print("按年龄再按成绩排序:", sorted_by_age_then_grade)自定义复杂排序逻辑:
key
file_names = ["img10.png", "img2.png", "img1.png", "img100.png"]
# 按照文件名中的数字部分进行排序 (例如 img1.png, img2.png, img10.png, img100.png)
import re
def natural_sort_key(s):
# 提取数字部分并转换为整数,非数字部分保持字符串
return [int(text) if text.isdigit() else text.lower()
for text in re.split('([0-9]+)', s)]
sorted_files = sorted(file_names, key=natural_sort_key)
print("自然排序文件:", sorted_files)这个
natural_sort_key
key
在Python中处理列表排序,除了知道如何用
sort()
sorted()
1. 排序稳定性(Stability)
Python的内置排序算法(Timsort,它是归并排序和插入排序的混合体)是稳定的。这意味着如果两个元素在排序时具有相同的键(或者说,它们在比较时被认为是相等的),那么它们在排序后的列表中会保持它们在原始列表中的相对顺序。
为什么稳定性很重要? 考虑一个场景:你有一份学生名单,每个学生有姓名和分数。
如果排序算法不稳定,第二次按分数排序可能会打乱第一次按姓名排序的相对顺序。但因为Python的排序是稳定的,你可以先按次要标准排序,再按主要标准排序,就能达到多级排序的效果。
示例:
data = [('apple', 3), ('banana', 1), ('cherry', 3), ('date', 2)]
# 先按字母顺序排序(次要标准)
sorted_by_name = sorted(data, key=lambda x: x[0])
print("按名称排序:", sorted_by_name)
# 输出: [('apple', 3), ('banana', 1), ('cherry', 3), ('date', 2)]
# 再按数字降序排序(主要标准),注意稳定性
# 对于数字相同的元素,它们在 sorted_by_name 中的相对顺序会被保留
final_sorted = sorted(sorted_by_name, key=lambda x: x[1], reverse=True)
print("先按名称再按数字降序排序:", final_sorted)
# 输出: [('apple', 3), ('cherry', 3), ('date', 2), ('banana', 1)]
# 注意 'apple' 和 'cherry' 都是3,它们在最终结果中仍然保持了 'apple' 在 'cherry' 之前的顺序,这就是稳定性。在实际项目中,多级排序的需求很常见,理解稳定性可以让你更自信地构建复杂的排序逻辑。
2. 复杂数据类型的排序
当列表中的元素不是简单的数字或字符串,而是自定义对象、混合类型元组等复杂数据类型时,直接排序可能会遇到问题,或者需要更精细的控制。
自定义对象: 如果你有一个自定义类的实例列表,直接调用
sorted()
list.sort()
key
TypeError
解决方案1:使用 key
key
解决方案2:实现 __lt__
__lt__
key
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person('{self.name}', {self.age})"
# 定义小于操作符,使得 Person 对象可以根据年龄进行比较
def __lt__(self, other):
if not isinstance(other, Person):
return NotImplemented
return self.age < other.age
people = [Person('Alice', 30), Person('Bob', 25), Person('Charlie', 30)]
# 现在可以直接排序,因为 Person 类定义了 __lt__
sorted_people = sorted(people)
print("按年龄自然排序:", sorted_people)
# 仍然可以使用 key 参数覆盖默认行为,例如按姓名排序
sorted_by_name = sorted(people, key=lambda p: p.name)
print("按姓名排序:", sorted_by_name)实现
__lt__
min()
max()
heapq
混合类型列表: Python 3 默认不允许对不同类型的元素进行比较(例如,
1 < 'a'
TypeError
key
mixed_list = [5, "apple", 2, "banana", 10]
# 这会报错:TypeError: '<' not supported between instances of 'str' and 'int'
# sorted_mixed = sorted(mixed_list)
# 解决方案:使用 key 函数,将所有元素转换为字符串进行比较
sorted_mixed_str = sorted(mixed_list, key=str)
print("混合类型按字符串排序:", sorted_mixed_str) # 输出: [10, 2, 5, 'apple', 'banana']
# 或者,更复杂的逻辑,例如先按类型分组,再在组内排序
def custom_mixed_sort_key(item):
if isinstance(item, int):
return (0, item) # 数字排在前面
elif isinstance(item, str):
return (1, item) # 字符串排在后面
return (2, str(item)) # 其他类型
sorted_mixed_custom = sorted(mixed_list, key=custom_mixed_sort_key)
print("混合类型自定义排序:", sorted_mixed_custom) # 输出: [2, 5, 10, 'apple', 'banana']处理复杂数据类型时,关键在于清晰地定义你希望的比较逻辑。
key
__lt__
以上就是python如何对列表进行排序_python列表排序sorted与sort方法详解的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号