返回

Python中的sort()与sorted()函数剖析及应用

后端

前言
在Python中,sort()sorted() 是两个常用的函数,它们都用于对列表或其他可迭代对象进行排序。然而,这两个函数之间存在一些细微的差别,掌握这些差别对于有效地使用它们至关重要。

比较

特性 sort() sorted()
可变性 可变 不可变
可迭代对象 仅限列表 列表、元组、字符串等
返回值 新列表
时间复杂度 最好:O(n log n),最坏:O(n^2) O(n log n)
空间复杂度 O(1) O(n)
用途 直接对列表进行排序 创建新的已排序列表

详解

1. 可变性

sort() 是一个可变函数,这意味着它直接对列表进行排序,并且改变了列表的原始顺序。因此,在使用 sort() 时,您应该确保列表是可变的,即不是元组或字符串。

2. 可迭代对象

sort() 只适用于列表,而 sorted() 可以用于任何可迭代对象,包括列表、元组、字符串、集合等。

3. 返回值

sort() 没有返回值,因为它直接对列表进行排序。sorted() 返回一个新的已排序列表,而不会改变原始列表。

4. 时间复杂度

sort() 的时间复杂度为最好情况下的 O(n log n) 和最坏情况下的 O(n^2),具体取决于排序算法的选择和输入数据的特性。sorted() 的时间复杂度始终为 O(n log n)。

5. 空间复杂度

sort() 的空间复杂度为 O(1),因为它不需要额外的空间来创建新的列表。sorted() 的空间复杂度为 O(n),因为它需要额外的空间来创建新的已排序列表。

何时使用

根据上述比较,您可以根据具体情况选择使用 sort()sorted() 函数。以下是一些使用建议:

  • 使用 sort()

    • 当您需要直接对列表进行排序时。
    • 当您不需要创建新的已排序列表时。
    • 当您需要控制排序算法时(通过指定 keyreverse 参数)。
    • 当您需要使用时间或空间效率更高的排序算法时。
  • 使用 sorted()

    • 当您需要对非列表对象进行排序时。
    • 当您需要创建新的已排序列表时。
    • 当您需要对列表进行简单排序时(不指定 keyreverse 参数)。
    • 当您需要使用更简洁、更具可读性的语法时。

代码示例

以下是一些代码示例,展示了 sort()sorted() 函数的用法:

# 使用 sort() 对列表排序
my_list = [3, 1, 2]
my_list.sort()
print(my_list)  # 输出:[1, 2, 3]

# 使用 sorted() 创建新的已排序列表
my_list = [3, 1, 2]
sorted_list = sorted(my_list)
print(sorted_list)  # 输出:[1, 2, 3]
print(my_list)  # 输出:[3, 1, 2]

# 使用 key 参数对列表中的对象按特定属性排序
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return f'{self.name} ({self.age})'

people = [
    Person('Alice', 20),
    Person('Bob', 30),
    Person('Charlie', 10),
]

sorted_people = sorted(people, key=lambda person: person.age)
print(sorted_people)  # 输出:[Person('Charlie', 10), Person('Alice', 20), Person('Bob', 30)]

# 使用 reverse 参数对列表进行反向排序
my_list = [3, 1, 2]
sorted_list = sorted(my_list, reverse=True)
print(sorted_list)  # 输出:[3, 2, 1]

结论

sort()sorted() 是 Python 中两个常用的排序函数,它们都有各自的优缺点。通过了解这些区别,您就可以根据具体情况选择使用哪种函数,从而提高您的编程效率和代码的可读性。