Python中列表排序最直接的方式是使用list.sort()原地修改或sorted()生成新列表。前者不返回新列表,仅改变原列表顺序,适用于内存敏感场景;后者可对任意可迭代对象排序且保留原数据,更安全通用。两者均支持key参数自定义排序逻辑(如len、lambda表达式),并可通过reverse=True实现降序。关键区别在于是否修改原列表及返回值:sort()返回None,易误用;sorted()始终返回新列表。选择依据为是否需保留原始数据、数据类型及内存考量。常见陷阱包括sort()的None返回值、混合类型不可比较问题,以及复杂key函数的性能开销。利用operator.itemgetter等工具可提升效率,而Timsort算法保证了排序稳定性,利于多级排序。(注:此摘要共149字符)

Python中对列表进行排序,最直接的两种方式是使用列表自身的
sort()
sorted()
key
reverse
Python列表的排序操作,说起来简单,但里面其实藏着不少可以玩味的技巧。从最基础的升序降序,到根据复杂逻辑进行定制化排序,Python都提供了非常优雅的解决方案。
首先,我们得知道两个核心工具:
list.sort()
sorted()
list.sort()
None
my_list = my_list.sort()
my_list
None
立即学习“Python免费学习笔记(深入)”;
# 示例:list.sort()
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
numbers.sort()
print(f"原地排序后:{numbers}") # 输出:[1, 1, 2, 3, 4, 5, 6, 9]
strings = ["apple", "zebra", "banana", "grape"]
strings.sort(reverse=True) # 降序排列
print(f"降序排序后:{strings}") # 输出:['zebra', 'grape', 'banana', 'apple']sorted()
# 示例:sorted()
data = (5, 2, 8, 1, 9) # 一个元组
sorted_data = sorted(data)
print(f"原始元组:{data}") # 输出:(5, 2, 8, 1, 9)
print(f"新排序列表:{sorted_data}") # 输出:[1, 2, 5, 8, 9]
words = ["cat", "dog", "elephant", "bird"]
sorted_by_length = sorted(words, key=len) # 根据字符串长度排序
print(f"按长度排序:{sorted_by_length}") # 输出:['cat', 'dog', 'bird', 'elephant']可以看到,
key
lambda
list.sort()
sorted()
这确实是初学者最常问的问题之一,也是理解Python排序机制的关键。我的经验是,它们的根本区别在于“是否原地修改”和“返回值”。
list.sort()
None
list.sort()
而
sorted()
sorted()
选择哪个,真的取决于你的具体需求:
sorted()
list.sort()
sorted()
None
sorted()
我个人在写代码时,除非有明确的内存或性能瓶颈,或者我确定原列表不再有用,否则我更倾向于使用
sorted()
自定义排序规则是Python排序功能强大之处的体现,这主要依赖于
key
key
lambda
根据元素长度排序: 比如你想把一堆单词按它们的字母数量排序。
words = ["apple", "banana", "grape", "kiwi", "orange"]
# 按字符串长度升序
sorted_by_len = sorted(words, key=len)
print(f"按长度排序:{sorted_by_len}") # 输出:['kiwi', 'grape', 'apple', 'banana', 'orange']根据嵌套结构中的特定元素排序: 假设你有一个学生列表,每个学生都是一个元组
(姓名, 年龄, 分数)
students = [
("Alice", 20, 95),
("Bob", 22, 88),
("Charlie", 21, 92),
("David", 20, 95)
]
# 按分数升序排序 (分数在索引2)
sorted_by_score = sorted(students, key=lambda s: s[2])
print(f"按分数排序:{sorted_by_score}")
# 输出:[('Bob', 22, 88), ('Charlie', 21, 92), ('Alice', 20, 95), ('David', 20, 95)]这里
lambda s: s[2]
多级排序(复合排序): 有时候你需要更复杂的排序逻辑,比如先按分数降序,如果分数相同,再按年龄升序。Python的排序是稳定的(Timsort算法),这意味着如果两个元素的
key
key
# 假设我们想先按分数降序,分数相同则按年龄升序
# 注意:这里需要一点技巧,因为默认是升序。
# 对于降序,我们可以对数值取负,或者使用 reverse=True。
# 这里我们演示返回元组的方式,分数取负实现降序,年龄正常升序
sorted_complex = sorted(students, key=lambda s: (-s[2], s[1]))
print(f"复杂排序(分数降序,年龄升序):{sorted_complex}")
# 输出:[('Alice', 20, 95), ('David', 20, 95), ('Charlie', 21, 92), ('Bob', 22, 88)]这里
lambda s: (-s[2], s[1])
(-分数, 年龄)
对于更复杂的场景,你甚至可以使用
operator
itemgetter
attrgetter
lambda
key
import operator
# 等同于按分数升序
sorted_by_score_op = sorted(students, key=operator.itemgetter(2))
print(f"使用itemgetter按分数排序:{sorted_by_score_op}")这些工具组合起来,让Python的列表排序变得异常灵活和强大。
即便Python的排序功能很强大,但使用不当也可能踩坑或者效率低下。
list.sort()
None
my_list = my_list.sort()
my_list
None
list.sort()
None
sorted()
混合类型列表的排序问题: Python 3 默认不允许直接比较不同类型的对象(比如数字和字符串),这会抛出
TypeError
mixed_list = [1, "hello", 3, "world"] # sorted(mixed_list) # 这会抛出 TypeError
如果你确实需要排序这样的列表,你需要提供一个
key
# 示例:转换为字符串进行比较
sorted_mixed = sorted(mixed_list, key=str)
print(f"混合类型列表按字符串排序:{sorted_mixed}") # 输出:[1, 3, 'hello', 'world']排序稳定性: Python 的
sorted()
list.sort()
key
key
key
key
key
operator.itemgetter
operator.attrgetter
lambda
key
key
(key_value, original_item)
original_item
# 假设有一个昂贵的 key_function
def expensive_key_func(item):
# 模拟耗时操作
import time
time.sleep(0.001)
return item * 2
large_list = list(range(1000))
# 预计算 key,然后排序
items_with_keys = [(expensive_key_func(item), item) for item in large_list]
sorted_items_with_keys = sorted(items_with_keys)
final_sorted_list = [item for key, item in sorted_items_with_keys]这种方式避免了在排序算法内部重复调用昂贵的
key
内存使用: 正如前面提到的,
list.sort()
sorted()
list.sort()
总的来说,Python的列表排序功能非常成熟和强大,理解
sort()
sorted()
key
以上就是Python怎么对列表进行排序_Python列表排序技巧汇总的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号