Python中的sort()和sorted()用法示例解析
一、list.sort()
sort()是列表(list)的內(nèi)置方法,直接對(duì)原列表進(jìn)行排序(原地排序),不返回新列表。
參數(shù)說明
key(可選):指定一個(gè)函數(shù)(內(nèi)置或自定義),用于從每個(gè)元素中提取比較鍵(如 key=str.lower)。
reverse(可選):布爾值,True 表示降序,F(xiàn)alse 表示升序(默認(rèn))。
常用內(nèi)置函數(shù)
abs(x):按絕對(duì)值排序(適用于數(shù)字)。
len(x):按長(zhǎng)度排序(適用于字符串、列表等)。
str.lower(x) 或 str.upper(x):忽略大小寫排序(適用于字符串)。
int(x) 或 float(x):轉(zhuǎn)換為數(shù)值后排序(適用于字符串?dāng)?shù)字)。
ord(x):按字符的 ASCII 碼排序(適用于單個(gè)字符)。
基本用法示例
numbers = [3, 1, 4, 1, 5, 9, 2] # 升序排序(默認(rèn)) numbers.sort() print(numbers) # [1, 1, 2, 3, 4, 5, 9] # 降序排序 numbers.sort(reverse=True) print(numbers) # [9, 5, 4, 3, 2, 1, 1] # 按絕對(duì)值排序 numbers = [-3, 1, -4, 2] numbers.sort(key=abs) print(numbers) # [1, 2, -3, -4]
自定義函數(shù)示例
# 返回元組的第 2 個(gè)元素
def get_second_element(item):
return item[1]
data = [("Alice", 25), ("Bob", 20), ("Jack", 30)]
data.sort(key=get_second_element) # 按年齡排序
print(data)
# [('Bob', 20), ('Alice', 25), ('Jack', 30)]lambda表達(dá)式示例
lambda是一種匿名函數(shù),適用于簡(jiǎn)單的key邏輯
# 按字符串的最后一個(gè)字符排序 words = ["apple", "banana", "cherry"] words.sort(key=lambda x: x[-1]) print(words) # ['banana', 'apple', 'cherry']
operator模塊的函數(shù)示例
operator 模塊提供了一些高效的 key 函數(shù):
operator.itemgetter(n):獲取可迭代對(duì)象的第 n 個(gè)元素(適用于元組、字典等)。
operator.attrgetter(‘attr’):獲取對(duì)象的屬性(適用于類實(shí)例)。
from operator import itemgetter
data = [("Alice", 25), ("Bob", 20), ("Jack", 30)]
# 按年齡排序(等同于 lambda x: x[1])
data.sort(key=itemgetter(1))
print(data)
# [('Bob', 20), ('Alice', 25), ('Jack', 30)]二、sorted()函數(shù)
sorted()是Python內(nèi)置函數(shù),對(duì)所有可迭代對(duì)象(如列表、元組、字典等)進(jìn)行排序,返回一個(gè)新列表,原對(duì)象不變。
參數(shù)說明
iterable:要排序的可迭代對(duì)象(如列表、元組、字符串等)。
key(可選):同 sort(),指定比較鍵。
reverse(可選):同 sort(),控制排序順序。
基本用法示例
# 對(duì)列表排序
numbers = [3, 1, 4, 1, 5]
sorted_numbers = sorted(numbers)
print(sorted_numbers)
# [1, 1, 3, 4, 5]
# 對(duì)字符串排序(按字符的 ASCII 碼)
word = "python"
sorted_word = sorted(word)
print(sorted_word)
# ['h', 'n', 'o', 'p', 't', 'y']
# 對(duì)元組排序
data = (("Alice", 25), ("Bob", 20), ("Jack", 30))
sorted_data = sorted(data, key=lambda x: x[1]) # 按年齡排序
print(sorted_data)
# [('Bob', 20), ('Alice', 25), ('Jack', 30)]按自定義規(guī)則排序示例
words = ["banana", "watermelon", "apple"] # 按單詞長(zhǎng)度排序 sorted_words = sorted(words, key=len) print(sorted_words) # ['apple', 'banana', 'watermelon']
多級(jí)排序示例
people = [("Alice", 25), ("Bob", 20), ("Charlie", 25)]
# 先按年齡升序,再按姓名降序
sorted_people = sorted(people, key=lambda x: (x[1], -ord(x[0][0])))
print(sorted_people)
# [('Bob', 20), ('Charlie', 25), ('Alice', 25)]
對(duì)字典的鍵或值排序
scores = {"Alice": 90, "Charlie": 75, "Bob": 85}
# 按鍵排序
sorted_by_name = sorted(scores.items())
print(sorted_by_name)
# [('Alice', 90), ('Bob', 85), ('Charlie', 75)]
# 按值排序
sorted_by_score = sorted(scores.items(), key=lambda x: x[1])
print(sorted_by_score)
# [('Charlie', 75), ('Bob', 85), ('Alice', 90)]三、sort和sorted的排序算法
list.sort()和sorted()函數(shù)使用的排序算法是Timsort,這是一種混合、穩(wěn)定的排序算法,結(jié)合了歸并排序(Merge Sort) 和 插入排序(Insertion Sort)的優(yōu)點(diǎn),并且效率極高。
Timsort 的核心原理
自適應(yīng)排序:
Timsort 根據(jù)輸入數(shù)據(jù)的特點(diǎn)自適應(yīng)地選擇排序策略:
- 對(duì)小規(guī)模數(shù)據(jù)(通常是 <=64個(gè)元素),直接使用插入排序(因?yàn)樵谛?shù)據(jù)量上插入排序的常數(shù)因子更小,速度更快);
- 對(duì)大規(guī)模數(shù)據(jù),采用歸并排序的分治思想,但會(huì)利用數(shù)據(jù)的現(xiàn)有順序(如部分已排序的子序列)。
利用數(shù)據(jù)的自然有序性:
Timsort 會(huì)掃描數(shù)據(jù),識(shí)別并分割已經(jīng)有序的片段(稱為 run),然后通過歸并排序?qū)⑦@些 run 合并。如果數(shù)據(jù)本身有部分有序,Timsort 的效率會(huì)顯著高于傳統(tǒng)歸并排序。
穩(wěn)定性:
Timsort是穩(wěn)定排序,即相等元素的相對(duì)順序在排序后保持不變。這對(duì)多關(guān)鍵字排序(如先按年齡排序,再按姓名排序)非常有用。
時(shí)間復(fù)雜度:
最壞情況:O(nlogn)(與歸并排序相同)。
最佳情況:O(n)(當(dāng)輸入數(shù)據(jù)已有序或接近有序時(shí),利用插入排序優(yōu)化)。
平均情況:O(nlogn)。
Timsort 的好處
實(shí)際數(shù)據(jù)友好:現(xiàn)實(shí)中的數(shù)據(jù)通常部分有序(如日志按時(shí)間接近有序),Timsort 能高效利用這一點(diǎn)。
平衡性能:對(duì)于不同規(guī)模和數(shù)據(jù)分布,Timsort 在平均和最壞情況下均表現(xiàn)良好(平均和最壞時(shí)間復(fù)雜度均為 O(n log n))。
Timsort廣泛應(yīng)用
Java
Arrays.sort() 和 Collections.sort()
JavaScript (V8 引擎)
V8 引擎(Chrome、Node.js)
Swift
標(biāo)準(zhǔn)庫的 sort() 方法
Rust
slice::sort 和 slice::sort_by
Kotlin
sort() 和 sorted() 函數(shù)
C#(部分場(chǎng)景)
Enumerable.OrderBy LINQ 方法
到此這篇關(guān)于Python中的sort()和sorted()用法示例解析的文章就介紹到這了,更多相關(guān)python sort()和sorted()用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python邏輯運(yùn)算符詳解與實(shí)際應(yīng)用指南
這篇文章主要介紹了Python邏輯運(yùn)算符詳解與實(shí)際應(yīng)用指南的相關(guān)資料,包括真值表、短路求值特性、運(yùn)算符優(yōu)先級(jí)及非布爾類型的處理,還提供了實(shí)際應(yīng)用案例和注意事項(xiàng),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
Python中正則表達(dá)式對(duì)單個(gè)字符,多個(gè)字符和匹配邊界等使用
這篇文章主要介紹了Python中正則表達(dá)式對(duì)單個(gè)字符,多個(gè)字符和匹配邊界等使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Python圖形繪制操作之正弦曲線實(shí)現(xiàn)方法分析
這篇文章主要介紹了Python圖形繪制操作之正弦曲線實(shí)現(xiàn)方法,涉及Python使用numpy模塊數(shù)值運(yùn)算及matplotlib.pyplot模塊進(jìn)行圖形繪制的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
Python實(shí)現(xiàn)多個(gè)Word文檔合并
在Python中,可以使用Python-docx庫來操作Word文檔,所以下面小編就為大家介紹一下如何利用Python-docx實(shí)現(xiàn)多個(gè)Word文檔合并功能吧,需要的可以參考一下2023-06-06
Python面向?qū)ο箢惥帉懠?xì)節(jié)分析【類,方法,繼承,超類,接口等】
這篇文章主要介紹了Python面向?qū)ο箢惥帉懠?xì)節(jié),較為詳細(xì)的分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類,方法,繼承,超類,接口等相關(guān)概念、使用技巧與注意事項(xiàng),需要的朋友可以參考下2019-01-01
Python實(shí)現(xiàn)UDP與TCP通信的示例詳解
UDP是一種無連接的、不可靠的傳輸協(xié)議;TCP是一種可靠的、面向連接的傳輸協(xié)議。這篇文章主要介紹了Python實(shí)現(xiàn)UDP與TCP通信的方法,需要的可以參考一下2023-03-03
Django1.9 加載通過ImageField上傳的圖片方法
今天小編就為大家分享一篇Django1.9 加載通過ImageField上傳的圖片方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Python使用Spire.XLS實(shí)現(xiàn)Excel轉(zhuǎn)PDF的實(shí)踐指南
在日常辦公中,將 Excel 文件轉(zhuǎn)換為 PDF 是一個(gè)常見的需求,但是手動(dòng)操作不僅繁瑣,而且還容易出錯(cuò),下面我們就來看看如何借助 Spire.XLS for Python,用幾行代碼輕松實(shí)現(xiàn) Excel 轉(zhuǎn) PDF吧2025-07-07

