sorted()
函数:智能排序器详解sorted()
是Python内置的一个非常实用的排序函数,它能够对任何可迭代对象进行排序,并返回一个新的已排序列表。与列表的sort()
方法不同,sorted()
不会修改原始数据,而是返回一个新的排序后的副本。
sorted(iterable, key=None, reverse=False)
参数说明:
iterable
:要排序的可迭代对象(列表、元组、字符串、字典等)key
:指定一个函数,用于从每个元素中提取比较键(可选)reverse
:布尔值,如果为True,则按降序排序(默认为False,即升序)numbers = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_numbers = sorted(numbers)
print(sorted_numbers) # 输出: [1, 1, 2, 3, 4, 5, 6, 9]
text = "python"
sorted_text = sorted(text)
print(sorted_text) # 输出: ['h', 'n', 'o', 'p', 't', 'y']
注意:对字符串排序会返回一个包含单个字符的列表。
tuples = [(1, 'b'), (2, 'a'), (1, 'a')]
sorted_tuples = sorted(tuples)
print(sorted_tuples) # 输出: [(1, 'a'), (1, 'b'), (2, 'a')]
key
参数自定义排序key
参数允许你指定一个函数,该函数将应用于每个元素,然后根据函数的结果进行排序。
words = ["banana", "pie", "apple", "cherry"]
sorted_words = sorted(words, key=len) # 按单词长度排序
print(sorted_words) # 输出: ['pie', 'apple', 'banana', 'cherry']
对于复杂数据结构,可以使用key
函数返回一个元组来实现多级排序:
students = [
{'name': 'Alice', 'age': 20, 'grade': 'A'},
{'name': 'Bob', 'age': 18, 'grade': 'B'},
{'name': 'Charlie', 'age': 20, 'grade': 'C'},
{'name': 'David', 'age': 18, 'grade': 'A'}
]
# 先按年龄升序,再按成绩降序
sorted_students = sorted(students, key=lambda x: (x['age'], -ord(x['grade'])))
for student in sorted_students:
print(student)
operator
模块简化key
函数Python的operator
模块提供了itemgetter()
和attrgetter()
函数,可以简化key
函数的编写:
from operator import itemgetter
data = [('apple', 3), ('banana', 2), ('cherry', 5)]
sorted_data = sorted(data, key=itemgetter(1)) # 按第二个元素排序
print(sorted_data) # 输出: [('banana', 2), ('apple', 3), ('cherry', 5)]
sorted()
函数使用Timsort算法,这是一种稳定的、自适应的排序算法,时间复杂度为O(n log n)。对于小型数据集,sorted()
的性能与列表的sort()
方法相当;对于大型数据集,sorted()
会创建一个新列表,因此会消耗更多内存。
list.sort()
的区别特性 | sorted() |
list.sort() |
---|---|---|
适用范围 | 任何可迭代对象 | 仅列表 |
返回值 | 新列表 | None(原地修改) |
原始数据 | 不改变 | 改变 |
方法/函数 | 内置函数 | 列表方法 |
files = ['document.txt', 'image.jpg', 'script.py', 'data.csv']
sorted_files = sorted(files, key=lambda x: x.split('.')[-1])
print(sorted_files) # 输出: ['data.csv', 'image.jpg', 'script.py', 'document.txt']
word_counts = {'apple': 5, 'banana': 3, 'cherry': 7, 'date': 1}
# 按值降序排序
sorted_words = sorted(word_counts.items(), key=lambda item: item[1], reverse=True)
print(sorted_words) # 输出: [('cherry', 7), ('apple', 5), ('banana', 3), ('date', 1)]
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name='{self.name}', age={self.age})"
people = [Person('Alice', 25), Person('Bob', 20), Person('Charlie', 30)]
sorted_people = sorted(people, key=lambda p: p.age)
print(sorted_people)
# 输出: [Person(name='Bob', age=20), Person(name='Alice', age=25), Person(name='Charlie', age=30)]
Python的sorted()
函数是一个强大而灵活的工具,它提供了:
key
参数实现自定义排序逻辑无论是简单的数字列表还是复杂的自定义对象集合,sorted()
都能帮助你高效地组织数据。记住它的非破坏性特性(返回新列表而不修改原数据)使其在函数式编程风格中特别有用。
掌握sorted()
函数的使用,将大大提升你在数据处理和算法实现中的效率和代码可读性。