Python 中 sort()
和 sorted()
的用法與區別
1. sort()
方法:
sort()
是 Python 列表類型 (list
) 的一個方法,它用于就地(原地)排序列表,修改原始列表。排序時可以通過 key
參數指定排序依據,還可以通過 reverse
參數來指定是否按降序排序。
語法:
list.sort(key=None, reverse=False)
key
:指定一個函數,用來從列表中的每個元素中提取出用于排序的值。reverse
:布爾值,True
時表示降序排序,False
時表示升序排序(默認)。
示例 1:基本用法
numbers = [5, 2, 9, 1, 5, 6]
numbers.sort()
print(numbers) # 輸出:[1, 2, 5, 5, 6, 9]
示例 2:按降序排序
numbers = [5, 2, 9, 1, 5, 6]
numbers.sort(reverse=True)
print(numbers) # 輸出:[9, 6, 5, 5, 2, 1]
示例 3:使用 key
參數按某個規則排序
items = [(3, 'apple'), (1, 'banana'), (2, 'cherry')]
items.sort(key=lambda x: x[0]) # 按照元組的第一個元素(數字)排序
print(items) # 輸出:[(1, 'banana'), (2, 'cherry'), (3, 'apple')]
注意:
sort()
是原地排序,會改變原始列表。- 如果你希望保留原始列表并得到一個新的排序結果,使用
sorted()
。
2. sorted()
函數:
sorted()
是一個內置函數,它可以用于任何可迭代對象(如列表、元組、字典等)。它會返回一個新的已排序的列表,并不會改變原始數據。
語法:
sorted(iterable, key=None, reverse=False)
iterable
:待排序的可迭代對象。key
:同sort()
,指定排序依據。reverse
:同sort()
,是否降序排列。
示例 1:基本用法
numbers = [5, 2, 9, 1, 5, 6]
new_numbers = sorted(numbers)
print(new_numbers) # 輸出:[1, 2, 5, 5, 6, 9]
print(numbers) # 原始列表未變:[5, 2, 9, 1, 5, 6]
示例 2:使用 key
參數按某個規則排序
items = [(3, 'apple'), (1, 'banana'), (2, 'cherry')]
new_items = sorted(items, key=lambda x: x[0]) # 按照元組的第一個元素排序
print(new_items) # 輸出:[(1, 'banana'), (2, 'cherry'), (3, 'apple')]
示例 3:按降序排序
numbers = [5, 2, 9, 1, 5, 6]
new_numbers = sorted(numbers, reverse=True)
print(new_numbers) # 輸出:[9, 6, 5, 5, 2, 1]
注意:
sorted()
會返回一個新的列表,原始數據不受影響。- 如果你不需要改變原始數據且想要一個新的排序列表,使用
sorted()
。
3. sort()
和 sorted()
的區別:
特性 | sort() | sorted() |
---|---|---|
修改原數據 | 是(原地排序) | 否(返回新列表,不修改原數據) |
返回值 | None (返回值是 None ,修改原列表) | 新排序的列表 |
適用范圍 | 僅適用于列表 (list ) | 適用于任何可迭代對象(如列表、元組、字典等) |
性能 | 因為是原地排序,內存效率更高 | 返回一個新的列表,會占用額外內存 |
例子:原地排序與返回新列表的對比
# 使用 sort()
numbers = [4, 2, 7, 1]
numbers.sort() # 原地排序
print(numbers) # 輸出:[1, 2, 4, 7]# 使用 sorted()
numbers = [4, 2, 7, 1]
sorted_numbers = sorted(numbers) # 返回新的列表
print(numbers) # 輸出:[4, 2, 7, 1] (原列表未改變)
print(sorted_numbers) # 輸出:[1, 2, 4, 7]
4. 如何選擇使用 sort()
或 sorted()
:
- 使用
sort()
:當你只需要修改原始列表并節省內存時。 - 使用
sorted()
:當你不想修改原始列表時,或者想對其他類型的可迭代對象(如元組、字典等)進行排序。
5. 解題思路:每一個查詢的最大美麗值
我們來看一下題目:
給定一個二維數組 items
,每個元素是 [price, beauty]
,以及一個查詢數組 queries
,對于每個查詢值,要求返回小于等于該查詢價格的所有物品中的最大美麗值。
我們可以通過以下步驟來優化解決這個問題:
1. 排序物品列表:
首先,我們可以按照物品的價格排序 items
,這樣方便在后續的查詢過程中增量地處理物品,避免重復遍歷。
2. 按查詢排序:
將 queries
按升序排序,這樣可以確保我們從小到大處理每個查詢。
3. 遍歷物品并增量更新最大美麗值:
對于每個查詢,使用兩個指針:一個指向物品列表,一個指向查詢數組。每次處理一個查詢時,我們通過指針 j
增量遍歷物品列表,更新當前可選物品中的最大美麗值。
代碼實現:
class Solution:def maximumBeauty(self, items: List[List[int]], queries: List[int]) -> List[int]:# 排序物品列表,按照價格排序items.sort(key=lambda item: item[0])# 按照查詢值升序排序,并記錄原始索引idx = sorted(range(len(queries)), key=lambda i: queries[i])# 初始化答案列表,max_beauty表示當前最大的美麗值ans = [0] * len(queries)max_beauty = 0j = 0# 遍歷查詢for i in idx:q = queries[i]# 處理查詢小于等于當前查詢價格的物品while j < len(items) and items[j][0] <= q:max_beauty = max(max_beauty, items[j][1])j += 1ans[i] = max_beautyreturn ans
示例:
items = [[1, 2], [3, 2], [2, 4], [5, 6], [3, 5]]
queries = [1, 2, 3, 4, 5, 6]
sol = Solution()
print(sol.maximumBeauty(items, queries)) # 輸出:[2, 4, 5, 5, 6, 6]
解題步驟:
- 物品排序:首先按價格對物品進行排序。
- 查詢排序:按查詢值升序排列,方便按順序處理每個查詢。
- 增量處理:遍歷每個查詢時,使用指針
j
增量遍歷物品并更新最大美麗值。
總結:
sort()
和sorted()
都是用來排序的工具,前者是原地排序,后者返回新排序的列表。sort()
適用于需要修改原始數據的情況,而sorted()
適用于需要保留原數據并得到排序結果的情況。- 對于這道題,通過排序物品和查詢,并通過增量處理來實現高效的查詢答案。