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: 一个函数,用于指定一个或多个用于比较的键。这个函数会作用于每个元素,然后根据函数返回的值进行排序。这在对复杂对象(如自定义类的实例、字典)进行排序时非常有用。
示例(使用 key 和 reverse):
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()。
浙公网安备 33010602011771号