Python中的sort方法、sorted函數(shù)與lambda表達(dá)式及用法詳解
1. sort()方法
1.1 sort()方法
list.sort()最核心、也最需要記住的特點是:它會直接修改原始列表,使其變?yōu)橛行驙顟B(tài)。也就是原地排序。因此,sort()方法的返回值是None。部分初學(xué)者可能會將其結(jié)果賦值給新變量,這種用法是錯誤的。正確的用法是無需將其結(jié)果賦值給新變量,直接使用被修改后的原列表即可,如下所示:
nums = [3, 1, 4, 1, 5, 9, 2] nums.sort() print(nums)
結(jié)果如下:
[1, 1, 2, 3, 4, 5, 9]
1.2 基本語法和參數(shù)
sort()方法的完整語法是:
list.sort(*, key=None, reverse=False)
它接受兩個可自選的關(guān)鍵字參數(shù):key和reverse。
A. reverse參數(shù)
這個參數(shù)非常直觀
- reverse = False(默認(rèn)值):升序排序
- reverse = True:降序排序
numbers = [4, 2, 8, 1, 6] numbers.sort() # 默認(rèn)升序 print(numbers) # 輸出: [1, 2, 4, 6, 8] numbers.sort(reverse=True) # 降序 print(numbers) # 輸出: [8, 6, 4, 2, 1]
B. key參數(shù)
key參數(shù)是sort()方法最強(qiáng)大的功能。它允許你自定義排序的邏輯。
key接受一個函數(shù)(通常是lambda匿名函數(shù))。在排序比較之前,列表中的每個元素都會先經(jīng)過這個key函數(shù)處理,然后Python會根據(jù)這個函數(shù)的返回值來進(jìn)行排序。
示例1:按字符串長度排序:
words = ["apple", "banana", "kiwi", "cherry"] # key=len 意味著對每個單詞應(yīng)用 len() 函數(shù),然后按長度排序 words.sort(key=len) print(words) # 輸出: ['kiwi', 'apple', 'banana', 'cherry']
示例2:忽略大小寫排序:
names = ["Bob", "alice", "Charlie", "david"] names.sort() print(names) # 輸出: ['Bob', 'Charlie', 'alice', 'david'] (默認(rèn)排序) names.sort(key=str.lower) print(names) # 輸出: ['alice', 'Bob', 'Charlie', 'david'] (忽略大小寫)
示例3:按對象的屬性排序(非常常用):
people = [
{'name': 'Alice', 'age': 30},
{'name': 'Bob', 'age': 25},
{'name': 'Charlie', 'age': 35}
]
# 使用 lambda 函數(shù)提取 'age' 的值作為排序的 key
people.sort(key=lambda person: person['age'])
print(people)
# 輸出:
# [{'name': 'Bob', 'age': 25}, {'name': 'Alice', 'age': 30}, {'name': 'Charlie', 'age': 35}]當(dāng)然也可以同時使用key和reverse:
# 按年齡降序排序
people.sort(key=lambda person: person['age'], reverse=True)
print(people)
# 輸出:
# [{'name': 'Charlie', 'age': 35}, {'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}]
2. sorted()函數(shù)
Python還提供了一個內(nèi)置函數(shù)sorted(),它也用于排序。理解它們的區(qū)別至關(guān)重要。
| list.sort() | sorted() | |
|---|---|---|
| 類型 | 列表的方法(method) | 內(nèi)置函數(shù)(function) |
| 使用對象 | 只能用于列表(list) | 可以用于任何可迭代對象(list, tuple, str, dict, etc.) |
| 修改 | 原地修改 | 不能修改原始對象,通常賦值給一個新的變量 |
| 返回值 | None | 返回一個新的、已排序的列表 |
2.1 代碼對比
# 使用 list.sort()
original_list = [5, 2, 3]
original_list.sort() # 直接修改 original_list
print(f"Original list after sort(): {original_list}") # 輸出: [2, 3, 5]
# 使用 sorted()
original_tuple = (5, 2, 3)
new_list = sorted(original_tuple) # 不會修改 original_tuple,而是返回新列表
print(f"Original tuple: {original_tuple}") # 輸出: (5, 2, 3)
print(f"New list from sorted(): {new_list}") # 輸出: [2, 3, 5]3. lambda函數(shù)
一個lambda函數(shù)是一個小型的、匿名的、單行表達(dá)式函數(shù)。
3.1 基本語法
lambda arguments: expression
- lambda:關(guān)鍵字,表示你正在定義一個lambda函數(shù)。
- arguments:和普通函數(shù)的參數(shù)一樣,可以有零個或多個,用逗號分割,也就是形參。
- expression:一個單獨的表達(dá)式。計算這個表達(dá)式的結(jié)果,并作為函數(shù)的返回值。
3.2 lambda函數(shù)與普通函數(shù)的對比
A. 使用def(普通函數(shù))
def add(x, y): return x + y result = add(2, 3) print(result) # 輸出: 5
B. 使用lambda(匿名函數(shù))
add_lambda = lambda x, y: x + y result = add_lambda(2, 3) print(result) # 輸出: 5
3.3 lambda表達(dá)式的用法
lambda的主要用途是作為高階函數(shù)的參數(shù),
示例1:sorted函數(shù)和sort方法自定義排序規(guī)則
這是lambda最經(jīng)典、最常見的用途。sorted函數(shù)和sort方法有一個key參數(shù),你可以提供一個函數(shù),sorted函數(shù)和sort方法會根據(jù)這個函數(shù)的返回值對元素進(jìn)行排序。假設(shè)有一個元組列表,每個元組代表 (商品, 價格)。我們想按價格排序。
items = [('apple', 2.5), ('banana', 1.8), ('cherry', 3.0)]
# 使用 def 的繁瑣方式
def get_price(item):
return item[1]
sorted_items = sorted(items, key=get_price)
print(sorted_items)
# 使用 lambda 的簡潔方式
sorted_items_lambda = sorted(items, key=lambda item: item[1])
print(sorted_items_lambda)
# 輸出都是:
# [('banana', 1.8), ('apple', 2.5), ('cherry', 3.0)]key=lambda item: item[1]創(chuàng)建了一個臨時的、無需命名的函數(shù),它接受一個item(元組),也就是items中的一個元素,并返回該元組的第二個元素(價格)。
其原理如下:
- sorted()函數(shù)開始工作,它拿到了
items列表。 - 它需要對列表中的元素進(jìn)行比較排序。它看到了
key=lambda item: item[1]這個規(guī)則。 - 它取出第一個元素
('apple', 2.5)。 - 它將這個元素傳遞給
lambda函數(shù),即item參數(shù)現(xiàn)在是('apple', 2.5)。 - lambda函數(shù)執(zhí)行它的表達(dá)式
item[1],返回的結(jié)果是2.5。sorted()函數(shù)在內(nèi)部記下:('apple', 2.5)的排序值為2.5。 - 接著,它取出第二個元素
('banana', 1.8)。 - 它將這個元素傳遞給lambda函數(shù),
item變成了('banana', 1.8)。 - lambda函數(shù)執(zhí)行
item[1],返回1.8。sorted()記下:('banana', 1.8)的排序值為1.8”。 - 它取出第三個元素
('cherry', 3.0),同樣地,通過lambda函數(shù)得到它的排序值為3.0。 - 最后,
sorted()根據(jù)這些排序值[2.5, 1.8, 3.0]來對原始的items列表進(jìn)行排序。1.8最小,2.5其次,3.0最大。 - 所以,最終返回的排序結(jié)果是:
[('banana', 1.8), ('apple', 2.5), ('cherry', 3.0)]。
上面的例子是對價格進(jìn)行升序排列,如果要進(jìn)行降序排列可以這樣寫:
items = [('apple', 2.5), ('banana', 1.8), ('cherry', 3.0)]
# 使用 lambda 的簡潔方式
# 該技巧僅適用于數(shù)值類型,其他類型,例如字符可能需要進(jìn)行多次排序
sorted_items_lambda = sorted(items, key=lambda item: -item[1])
print(sorted_items_lambda)
# 輸出是:
# [('cherry', 3.0), ('apple', 2.5), ('banana', 1.8)]如果要進(jìn)行多級排序,可以這樣寫:
# 列表中元組中元素的含義分別為名稱、價格、重量
data = [
('Cherry', 20, 100),
('Apple', 20, 150),
('Banana', 30, 120),
('Date', 10, 500),
('Blueberry', 20, 100)
]
# 使用 lambda 返回一個元組作為排序的 key
# (item[1], item[2], item[0]) -> (價格, 重量, 名稱)
# 先按照價格排序,價格相同的情況下按照重量排序,價格和重量都相同的情況下按照名稱進(jìn)行排序
sorted_data = sorted(data, key=lambda item: (item[1], item[2], item[0]))
print(sorted_data)
# 輸出結(jié)果為:
[('Date', 10, 500), ('Blueberry', 20, 100), ('Cherry', 20, 100), ('Apple', 20, 150), ('Banana', 30, 120)]示例2:map()——對序列中的每個元素應(yīng)用函數(shù)
numbers = [1, 2, 3, 4, 5] # 使用 lambda squared_numbers = map(lambda x: x * x, numbers) print(list(squared_numbers)) # 輸出: [1, 4, 9, 16, 25]
示例3:filter()——篩選序列中的元素
# 從序列中篩選出所有的偶數(shù) numbers = [1, 2, 3, 4, 5, 6, 7, 8] # 使用 lambda even_numbers = filter(lambda x: x % 2 == 0, numbers) print(list(even_numbers)) # 輸出: [2, 4, 6, 8]
到此這篇關(guān)于Python中的sort方法、sorted函數(shù)與lambda表達(dá)式及用法詳解的文章就介紹到這了,更多相關(guān)python sort sorted函數(shù)與lambda表達(dá)式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Cannot?set?up?a?python?SDK?at?Python問題
本文主要介紹了解決Cannot?set?up?a?python?SDK?at?Python問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
python 統(tǒng)計文件中的字符串?dāng)?shù)目示例
今天小編就為大家分享一篇python 統(tǒng)計文件中的字符串?dāng)?shù)目示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
matplotlib實現(xiàn)自定義散點形狀marker的3種方法
本文主要介紹了matplotlib實現(xiàn)自定義散點形狀marker的3種方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
Python實現(xiàn)快速排序算法及去重的快速排序的簡單示例
quick sort快速排序是一種再基礎(chǔ)不過的排序算法,使用Python代碼寫起來相當(dāng)簡潔,這里我們就來看一下Python實現(xiàn)快速排序算法及去重的快速排序的簡單示例:2016-06-06
Python編程中實現(xiàn)迭代器的一些技巧小結(jié)
只談迭代器的話在Python中只是一個泛指的概念,具體的可以用yield、生成器表達(dá)式、iter等多種方式來構(gòu)建,這里我們整理了Python編程中實現(xiàn)迭代器的一些技巧小結(jié):2016-06-06

