Python中排序列表最常用的方法是list.sort()和sorted()函数。list.sort()直接修改原列表,不返回新列表,适用于无需保留原始顺序的场景;sorted()则返回一个新的已排序列表,原列表保持不变,适合需要保留原始数据的情况。两者均支持reverse参数进行降序排序,并使用高效的Timsort算法。关键区别在于:list.sort()是原地操作,节省内存;sorted()无副作用,更安全灵活。对于复杂排序需求,可通过key参数传入函数实现自定义规则,如按对象属性、忽略大小写或多重条件排序。处理混合数据类型时,可设计key函数统一比较逻辑,确保不同类型元素能正确排序。掌握这两种方法及其适用场景,有助于编写高效且可维护的代码。

Python中对列表进行排序,最直接且常用的方法就是利用其内置的
list.sort()
sorted()
当我们需要对Python列表进行排序时,通常会用到两个核心工具:
list.sort()
sorted()
list.sort()
None
my_list = [3, 1, 4, 1, 5, 9, 2, 6]
print(f"原始列表: {my_list}")
my_list.sort() # 对原列表进行排序
print(f"排序后的列表 (list.sort()): {my_list}") # 输出: [1, 1, 2, 3, 4, 5, 6, 9]
# 降序排序也很简单
my_list = [3, 1, 4, 1, 5, 9, 2, 6]
my_list.sort(reverse=True)
print(f"降序排序后的列表: {my_list}") # 输出: [9, 6, 5, 4, 3, 2, 1, 1]而
sorted()
立即学习“Python免费学习笔记(深入)”;
another_list = [3, 1, 4, 1, 5, 9, 2, 6]
print(f"原始列表: {another_list}")
new_sorted_list = sorted(another_list) # 返回一个新的已排序列表
print(f"sorted()返回的新列表: {new_sorted_list}") # 输出: [1, 1, 2, 3, 4, 5, 6, 9]
print(f"原始列表 (未改变): {another_list}") # 输出: [3, 1, 4, 1, 5, 9, 2, 6]
# sorted()同样支持降序
new_desc_list = sorted(another_list, reverse=True)
print(f"sorted()降序返回的新列表: {new_desc_list}") # 输出: [9, 6, 5, 4, 3, 2, 1, 1]这两个方法都默认进行升序排序。如果需要降序,只需将
reverse
True
在我看来,理解
list.sort()
sorted()
list.sort()
list.sort()
None
None
反观
sorted()
举个例子,假设你正在处理用户输入的一串数字,你既想展示排序后的结果,又想保留原始输入以便进行其他分析(比如计算平均值,而排序会打乱原始顺序)。这时,
sorted()
list.sort()
sorted()
Python的排序功能远不止升序降序那么简单,它允许你通过
key
这个
key
最常见的用法是配合
lambda
# 1. 排序字符串列表,忽略大小写
words = ["apple", "Banana", "cherry", "Date"]
# 默认排序会把大写字母排在前面
print(f"默认排序: {sorted(words)}") # 输出: ['Banana', 'Date', 'apple', 'cherry']
# 使用key=str.lower忽略大小写
print(f"忽略大小写排序: {sorted(words, key=str.lower)}") # 输出: ['apple', 'Banana', 'cherry', 'Date']
# 2. 排序元组列表,根据元组的第二个元素
students = [("Alice", 20, "Math"), ("Bob", 18, "Physics"), ("Charlie", 22, "Chemistry")]
# 默认排序是根据第一个元素
print(f"默认排序: {sorted(students)}")
# 根据年龄(第二个元素)排序
print(f"按年龄排序: {sorted(students, key=lambda student: student[1])}") # 输出: [('Bob', 18, 'Physics'), ('Alice', 20, 'Math'), ('Charlie', 22, 'Chemistry')]
# 3. 排序自定义对象列表
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}, Stock:{self.stock})"
products = [
Product("Laptop", 1200, 50),
Product("Mouse", 25, 200),
Product("Keyboard", 75, 100),
Product("Monitor", 300, 30)
]
# 按价格排序
print(f"按价格排序: {sorted(products, key=lambda p: p.price)}")
# 按库存量排序 (降序)
print(f"按库存降序排序: {sorted(products, key=lambda p: p.stock, reverse=True)}")
# 4. 甚至可以按多个条件排序
# 先按价格升序,价格相同再按库存降序
# 注意:key函数返回一个元组,Python会按元组的顺序进行比较
print(f"按价格升序,库存降序: {sorted(products, key=lambda p: (p.price, -p.stock))}")
# 这里的-p.stock是为了实现降序,因为默认是升序比较使用
key
key
key
处理混合数据类型或者复杂对象的排序,确实是排序操作中比较有挑战性的一个方面。Python的默认排序机制,在面对不同类型的数据时,通常会因为无法确定比较规则而抛出
TypeError
# 混合数据类型示例 mixed_list = [1, "hello", 3.14, "world", 2] # sorted(mixed_list) # 这会抛出 TypeError: '<' not supported between instances of 'str' and 'int'
要解决这个问题,核心思路依然是利用
key
1. 处理混合数据类型: 当列表包含多种类型的数据时,你可以编写一个
key
mixed_list = [1, "hello", 3.14, "world", 2, "Python"]
def custom_key_for_mixed_types(item):
if isinstance(item, int):
return (0, item) # 整数优先级最高,然后按值排序
elif isinstance(item, float):
return (1, item) # 浮点数次之
elif isinstance(item, str):
return (2, item.lower()) # 字符串优先级最低,按小写字母排序
else:
return (3, str(item)) # 其他类型,转换为字符串处理
print(f"混合类型排序: {sorted(mixed_list, key=custom_key_for_mixed_types)}")
# 输出: [1, 2, 3.14, 'hello', 'Python', 'world']这里,我给每种类型分配了一个优先级(元组的第一个元素),然后用元素本身(或其转换形式)作为元组的第二个元素。这样,Python在比较时,会先比较优先级,优先级相同再比较实际值。这是一种非常实用的策略。
2. 处理复杂对象(自定义类的实例): 对于自定义类的实例,如果没有特别指定,Python默认会比较它们的内存地址,这通常不是我们想要的。要让自定义对象可排序,有几种方法:
使用key
Product
key=lambda obj: obj.attribute
实现特殊方法__lt__
obj1 < obj2
__lt__
functools.total_ordering
__lt__
__eq__
from functools import total_ordering
@total_ordering
class Book:
def __init__(self, title, author, pages):
self.title = title
self.author = author
self.pages = pages
def __repr__(self):
return f"Book('{self.title}', '{self.author}', {self.pages}页)"
def __eq__(self, other):
if not isinstance(other, Book):
return NotImplemented
return (self.title, self.author, self.pages) == \
(other.title, other.author, other.pages)
def __lt__(self, other): # 定义小于操作,这里按页数排序
if not isinstance(other, Book):
return NotImplemented
return self.pages < other.pages
books = [
Book("Python Crash Course", "Eric Matthes", 544),
Book("Fluent Python", "Luciano Ramalho", 912),
Book("Automate the Boring Stuff", "Al Sweigart", 500)
]
print(f"按页数排序 (__lt__): {sorted(books)}")
# 输出: [Book('Automate the Boring Stuff', 'Al Sweigart', 500页), Book('Python Crash Course', 'Eric Matthes', 544页), Book('Fluent Python', 'Luciano Ramalho', 912页)]这种方式的好处是,一旦定义了比较规则,你的对象就可以在任何需要比较的地方直接使用,而不仅仅是排序。但缺点是,它将排序逻辑“硬编码”到了类定义中,如果需要多种排序方式,可能就得回到
key
__lt__
key
在处理这些复杂场景时,关键在于把不同类型或复杂对象“映射”到一个可比较的统一形式。这个映射过程就是
key
以上就是python怎么排序列表_python列表排序方法大全的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号