sort() 和 sorted()的区别

在 Python 中,sort()sorted() 都是用来对序列进行排序的方法,但它们之间有几个核心的区别:

1. sort() 方法

  • 是列表(List)的方法: sort() 只能用于列表对象,它不是一个通用的函数。
  • 原地排序(In-place sorting): sort() 方法会直接修改原始列表,对其进行排序,而不会创建新的列表。
  • 没有返回值: sort() 方法的返回值为 None。如果尝试获取其返回值,你将得到 None,这在链式操作中可能会导致问题。
  • 效率: 由于是原地修改,通常在内存使用上更高效,因为它不需要额外的空间来存储排序后的副本。

示例:

my_list = [3, 1, 4, 1, 5, 9, 2, 6]
print(f"原始列表: {my_list}")

return_value = my_list.sort() # 对列表进行原地排序

print(f"排序后的列表: {my_list}") # 列表已经被修改
print(f"sort() 的返回值: {return_value}") # None

输出:

原始列表: [3, 1, 4, 1, 5, 9, 2, 6]
排序后的列表: [1, 1, 2, 3, 4, 5, 6, 9]
sort() 的返回值: None

2. sorted() 函数

  • 是内置函数(Built-in function): sorted() 是 Python 内置的一个通用函数,可以对任何可迭代对象进行排序(例如列表、元组、字符串、集合、字典的键等)。
  • 返回一个新列表: sorted() 函数会创建一个新的列表,其中包含排序后的元素,而不会修改原始可迭代对象。
  • 有返回值: sorted() 函数的返回值为一个新创建的排序后的列表。
  • 通用性: 由于它不修改原对象,因此适用于那些需要保持原始数据不变的场景,或者对不可变对象(如元组、字符串)进行排序的场景。

示例:

my_list = [3, 1, 4, 1, 5, 9, 2, 6]
my_tuple = (5, 2, 8, 1)
my_string = "hello"
my_set = {3, 1, 4}

print(f"原始列表: {my_list}")
print(f"原始元组: {my_tuple}")
print(f"原始字符串: {my_string}")
print(f"原始集合: {my_set}")

# 对列表进行排序
sorted_list = sorted(my_list)
print(f"sorted() 后的列表 (新列表): {sorted_list}")
print(f"原始列表 (未修改): {my_list}")

# 对元组进行排序
sorted_tuple = sorted(my_tuple) # 返回的是列表
print(f"sorted() 后的元组 (返回列表): {sorted_tuple}")
print(f"原始元组 (未修改): {my_tuple}")

# 对字符串进行排序
sorted_string_chars = sorted(my_string) # 返回字符列表
print(f"sorted() 后的字符串字符 (返回列表): {sorted_string_chars}")
print(f"原始字符串 (未修改): {my_string}")

# 对集合进行排序
sorted_set_elements = sorted(my_set) # 返回列表
print(f"sorted() 后的集合元素 (返回列表): {sorted_set_elements}")
print(f"原始集合 (未修改): {my_set}")

输出:

原始列表: [3, 1, 4, 1, 5, 9, 2, 6]
原始元组: (5, 2, 8, 1)
原始字符串: hello
原始集合: {1, 3, 4}
sorted() 后的列表 (新列表): [1, 1, 2, 3, 4, 5, 6, 9]
原始列表 (未修改): [3, 1, 4, 1, 5, 9, 2, 6]
sorted() 后的元组 (返回列表): [1, 2, 5, 8]
原始元组 (未修改): (5, 2, 8, 1)
sorted() 后的字符串字符 (返回列表): ['e', 'h', 'l', 'l', 'o']
原始字符串 (未修改): hello
sorted() 后的集合元素 (返回列表): [1, 3, 4]
原始集合 (未修改): {1, 3, 4}

3. 共同的参数 (key 和 reverse)

sort()sorted() 都接受两个可选的参数来定制排序行为:

  • reverse 一个布尔值。如果设置为 True,则按降序排序;默认为 False (升序)。
  • key 一个函数,用于指定一个或多个用于比较的键。这个函数会作用于每个元素,然后根据函数返回的值进行排序。这在对复杂对象(如自定义类的实例、字典)进行排序时非常有用。

示例(使用 keyreverse):

words = ["banana", "apple", "cherry", "date"]

# 按字符串长度降序排序
words.sort(key=len, reverse=True)
print(f"按长度降序排序 (sort): {words}") # ['banana', 'cherry', 'apple', 'date']

fruits = [("apple", 3), ("banana", 1), ("cherry", 2)]

# 按第二个元素(数量)升序排序
sorted_fruits = sorted(fruits, key=lambda item: item[1])
print(f"按数量升序排序 (sorted): {sorted_fruits}") # [('banana', 1), ('cherry', 2), ('apple', 3)]

# 按第二个元素(数量)降序排序
sorted_fruits_desc = sorted(fruits, key=lambda item: item[1], reverse=True)
print(f"按数量降序排序 (sorted): {sorted_fruits_desc}") # [('apple', 3), ('cherry', 2), ('banana', 1)]

总结比较

特性 list.sort() sorted()
类型 列表的方法 内置函数
作用对象 只能是列表 任何可迭代对象 (列表、元组、字符串、集合等)
修改原对象 原地修改原始列表 不修改原始对象,返回新列表
返回值 None 返回一个新列表
内存开销 较低(原地修改) 较高(创建新列表)
适用场景 当你只需要修改列表本身,不需要保留原列表,且排序对象是列表时。 当你需要排序任何可迭代对象,或者需要保留原始数据不变时。

在实际编程中,根据你的需求选择合适的方法:如果你需要原地修改列表并节省内存,使用 sort();如果你需要一个排序后的新副本而不改变原对象,或者要排序非列表的可迭代对象,使用 sorted()

posted @ 2025-08-15 15:16  咩啊咩咩咩  阅读(76)  评论(0)    收藏  举报