Python高階函數-sorted(深度解析從原理到實戰)

在這里插入圖片描述

一、sorted()函數概述

sorted()是Python內置的高階函數,用于對可迭代對象進行排序操作。與列表的sort()方法不同,sorted()會返回一個新的已排序列表,而不改變原數據。

基本語法

sorted(iterable, *, key=None, reverse=False)

二、核心參數詳解

1. iterable(必需參數)

任何可迭代對象(列表、元組、字符串、字典等)

2. key(關鍵參數)

  • 接受一個函數作為參數
  • 該函數會被應用到每個元素上,根據函數返回值進行排序
  • 默認值為None,表示直接比較元素本身

3. reverse(排序方向)

  • 布爾值參數
  • False表示升序(默認)
  • True表示降序

三、底層實現原理

sorted()內部使用TimSort算法(一種混合了歸并排序和插入排序的穩定算法):

  • 時間復雜度:O(n log n)
  • 空間復雜度:O(n)
  • 穩定性:保持相等元素的原始順序
# 偽代碼展示基本邏輯
def sorted(iterable, key=None, reverse=False):# 1. 獲取可迭代對象的元素列表elements = list(iterable)# 2. 如果有key函數,應用轉換if key is not None:decorated = [(key(x), i, x) for i, x in enumerate(elements)]else:decorated = elements# 3. 執行TimSort排序decorated.sort()# 4. 還原原始數據(保持穩定性)if key is not None:result = [x for (k, i, x) in decorated]else:result = decorated# 5. 處理排序方向if reverse:result.reverse()return result

四、高級使用技巧

1. 復雜對象排序

students = [{'name': 'Alice', 'age': 20, 'score': 85},{'name': 'Bob', 'age': 19, 'score': 92},{'name': 'Charlie', 'age': 21, 'score': 78}
]# 按分數降序排序
sorted_students = sorted(students, key=lambda x: x['score'], reverse=True)

2. 多條件排序

# 先按年齡升序,年齡相同按分數降序
sorted_students = sorted(students,key=lambda x: (x['age'], -x['score']))

3. 使用operator模塊

from operator import itemgetter, attrgetter# 等價于 lambda x: x['score']
sorted_students = sorted(students, key=itemgetter('score'))# 類對象排序
class Student: ...
sorted_students = sorted(students, key=attrgetter('age'))

4. 自定義排序規則

def custom_sort(x):# 奇偶數優先排序:奇數在前,數值小的在前return (x % 2 == 0, x)nums = [3, 1, 4, 2]
sorted_nums = sorted(nums, key=custom_sort)  # [1, 3, 2, 4]

五、性能優化建議

  1. 避免在key函數中進行復雜計算:key函數會被頻繁調用,應保持簡單高效
  2. 考慮使用生成器:對于大數據集,可以先用生成器預處理
  3. 預編譯key函數:對于重復使用的key函數,可以預編譯或緩存結果
  4. 考慮穩定性需求:當需要保持相等元素的原始順序時,sorted()是更好的選擇

六、與sort()方法的對比

特性sorted()list.sort()
返回值新列表None(原地修改)
原始數據不改變直接修改
適用對象任何可迭代對象僅列表
鏈式操作支持不支持
內存使用更高(需要副本)更低

七、實際應用案例

1. 日志文件按時間排序

log_lines = ["2023-01-15 ERROR: Disk full","2023-01-10 INFO: System started","2023-01-12 WARNING: Memory low"
]sorted_logs = sorted(log_lines, key=lambda x: x.split()[0])

2. 文件名自然排序

import refiles = ["file1.txt", "file10.txt", "file2.txt"]
sorted_files = sorted(files, key=lambda x: int(re.search(r'\d+', x).group()))

3. 多語言字符串排序

import locale
locale.setlocale(locale.LC_COLLATE, 'fr_FR.UTF-8')words = ['été', 'h?tel', 'arbre']
sorted_words = sorted(words, key=locale.strxfrm)

八、常見問題解答

Q1: sorted()如何處理None值?
A: 在Python中,None不能與其他值比較。解決方案:

sorted_list = sorted(mixed_list, key=lambda x: (x is None, x))

Q2: 如何實現自定義排序類?

class CustomOrder:_order = ['high', 'medium', 'low']def __init__(self, value):self.value = valuedef __lt__(self, other):return self._order.index(self.value) < self._order.index(other.value)sorted_items = sorted([CustomOrder(x) for x in ['low', 'high', 'medium']])

Q3: 超大文件如何高效排序?
使用外部排序(分塊讀取+歸并):

def external_sort(file_path):# 分塊讀取并排序chunks = []with open(file_path) as f:while True:chunk = list(itertools.islice(f, 10000))  # 每次讀1萬行if not chunk:breakchunk.sort()chunks.append(chunk)# 多路歸并return list(heapq.merge(*chunks))

九、總結

sorted()作為Python的核心高階函數,其強大之處在于:

  • 靈活的參數設計(特別是key函數)
  • 穩定的排序算法
  • 廣泛的應用場景
  • 優秀的性能表現

掌握sorted()的高級用法,可以讓你寫出更Pythonic、更高效的排序代碼。建議在實際項目中多實踐各種排序場景,深入理解其底層原理。

擴展閱讀:Python官方文檔中關于排序指南的詳細說明

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75927.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75927.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75927.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ArcGIS Pro/GeoScene Pro AI 助手 2.1

引言 面對ArcGIS Pro/GeoScene Pro復雜的操作界面和腳本開發需求&#xff0c;你是否還在為功能定位、代碼調試和效率優化而煩惱&#xff1f;今天&#xff0c;推出自制的Pro AI助手2.0版本&#xff0c;七大核心功能將革新你的GIS工作方式&#xff01;無論是界面操作指引、一鍵生…

如何將本地更改的README文件同步到自己的GitHub項目倉庫

如何將本地更改的 README 文件同步到 GitHub 倉庫 在你 git clone 下來的工程目錄下&#xff1a; 先使用 robocopy YOUR\SOURCE\CODE\DIR YOUR\GIT\CLONE\DIR /E /XD .git /DCOPY:T 將你的更改Copy到你git下來的工程中&#xff08;上面的命令會自動處理&#xff0c;例如只會C…

PostIn V1.0.8版本發布,IDEA 插件支持一鍵掃描上報,讓接口定義不再繁瑣

PostIn是一款國產開源免費的接口管理工具&#xff0c;包含項目管理、接口調試、接口文檔設計、接口數據MOCK等模塊&#xff0c;支持常見的HTTP協議、websocket協議等&#xff0c;支持免登陸本地接口調試&#xff0c;同時可以對項目進行靈活的成員權限、消息通知管理等。本周Pos…

UE5學習筆記 FPS游戲制作36 UI動畫

文章目錄 目的效果創建動畫UI準備制作動畫 播放動畫目的效果創建動畫UI準備制作動畫 播放動畫注冊播放事件 目的效果 我們要創建一個提示動畫&#xff0c;文字先漸顯&#xff0c;然后向上移動&#xff0c;同時漸隱 創建動畫 UI準備 創建一個UI控件&#xff0c;然后創建一個…

HTTP 響應頭 Strict-Transport-Security 缺失漏洞

HTTP 響應頭 Strict-Transport-Security 缺失漏洞 這個漏洞就是說明網站的HTTP響應頭中沒有設置Strict-Transport-Security&#xff0c;沒有設置則可以通過將https自己手動改成htttp的方式進行訪問。不安全 解決方法 1.nginx配置 nginx中增加如下配置&#xff1a; location / …

代理模式的優缺點是什么?

什么是代理模式&#xff1f; 代理模式&#xff08;Proxy Pattern&#xff09;是一種結構型設計模式&#xff0c;它通過創建代理對象來控制對原始對象的訪問。 這種模式在前端開發中廣泛應用&#xff0c;特別是在需要控制對象訪問、添加額外邏輯或優化性能的場景中。 ??核心…

【嵌入式學習3】UDP發送端、接收端

目錄 1、發送端 2、接收端 3、UDP廣播 1、發送端 from socket import *udp_socket socket(AF_INET,SOCK_DGRAM) udp_socket.bind(("127.0.0.1",3333))data_str "UDP發送端數據" data_bytes data_str.encode("utf-8") udp_socket.sendto(d…

AI重構SEO關鍵詞精準布局

內容概要 在傳統SEO策略面臨搜索場景碎片化、用戶意圖復雜化的挑戰下&#xff0c;AI技術通過多維數據分析與算法建模&#xff0c;正在重構關鍵詞布局的邏輯框架。基于自然語言處理&#xff08;NLP&#xff09;的語義分析能力&#xff0c;AI可精準識別搜索詞背后的需求層級&…

谷歌發布網絡安全AI新模型Sec-Gemini v1

谷歌近日宣布推出實驗性AI模型Sec-Gemini v1&#xff0c;旨在通過人工智能技術革新網絡安全防御體系。該模型由Sec-Gemini團隊成員Elie Burzstein和Marianna Tishchenko共同研發&#xff0c;旨在幫助網絡安全人員應對日益復雜的網絡威脅。 攻防不對稱的破局之道 Sec-Gemini團隊…

IntelliJ IDEA下開發FPGA——FPGA開發體驗提升__下

前言 由于Quartus寫代碼比較費勁&#xff0c;雖然新版已經有了代碼補全&#xff0c;但體驗上還有所欠缺。于是使用VS Code開發&#xff0c;效果如下所示&#xff0c;代碼樣式和基本的代碼補全已經可以滿足開發&#xff0c;其余工作則交由Quartus完成 但VS Code的自帶的git功能&…

Python語言的需求分析

Python語言的需求分析 引言 在信息技術快速發展的今天&#xff0c;編程語言的選擇對于軟件開發的成功與否起著至關重要的作用。Python作為一種高級編程語言&#xff0c;以其簡潔易讀的語法和強大的功能受到越來越多開發者的青睞。通過對Python語言的需求分析&#xff0c;我們…

抓wifi無線空口包之Ubuntu抓包(二)

一、設置網卡信道和頻段&#xff0c;并抓包 1、使用iwconfig查看自己機器的無線網卡名稱 wangwang-ThinkCentre-M930t-N000:~$ iwconfig lo no wireless extensions. eno1 no wireless extensions. enxc8a3624ab329 no wireless extensions. wlx90de80d1b5b1 IE…

深度學習實戰電力設備缺陷檢測

本文采用YOLOv11作為核心算法框架&#xff0c;結合PyQt5構建用戶界面&#xff0c;使用Python3進行開發。YOLOv11以其高效的實時檢測能力&#xff0c;在多個目標檢測任務中展現出卓越性能。本研究針對電力設備缺陷數據集進行訓練和優化&#xff0c;該數據集包含豐富的電力設備缺…

Day1:前端項目uni-app壁紙實戰

uni-app官網下載HBuilder。 uni-app快速上手 | uni-app官網 點擊HBuilder 安裝 新建項目 工具——插件安裝 安裝uni-app&#xff08;vue3&#xff09; 我們先來準備一下&#xff1a; 先在wallpaper下新建目錄 我已經建過了 同樣&#xff0c;再在common下建images和style目錄&…

mac命令操作

mac命令操作 快速刪除一行&#xff1a; control u 剪切文件&#xff1a;步驟1、先進行Command c 進行選擇復制文件&#xff0c;2、進行commandoptionv進行移動文件&#xff0c;如果commandv是進行復制文件。 commandcontrolD 三個鍵即可屏幕取詞進行翻譯 mac中可以使用快捷方…

C#語言的加密貨幣

C#語言與加密貨幣&#xff1a;一個開發者的探索之旅 引言 隨著區塊鏈技術的迅猛發展&#xff0c;加密貨幣的應用已經滲透到我們生活的方方面面。作為一種新興的數字資產&#xff0c;加密貨幣不僅改變了傳統的投資方式&#xff0c;而且對全球經濟產生了深遠影響。其中&#xf…

Mysql 概念

MySQL 是一種 關系型數據庫管理系統&#xff08;RDBMS&#xff09;&#xff0c;它使用 結構化查詢語言&#xff08;SQL&#xff09; 來管理和操作數據。它最初由瑞典公司 MySQL AB 開發&#xff0c;后來被 Sun Microsystems 收購&#xff0c;現在屬于 Oracle 公司。 一、MySQL…

Golang 項目平滑重啟

引言 平滑重啟&#xff08;Graceful Restart&#xff09;技術作為一種常用的解決方案&#xff0c;通過允許新進程接管而不中斷現有的請求&#xff0c;確保了系統的穩定運行和業務連續性。同時目前公司的服務重啟絕大部分也都適用的 go 的平滑重啟技術。 本部分將對平滑重啟的…

SQL SELECT DISTINCT 語句詳解:精準去重的藝術

在數據驅動的時代&#xff0c;數據質量直接影響決策的準確性。面對海量數據時&#xff0c;重復記錄如同沙礫中的金屑&#xff0c;既占用存儲空間&#xff0c;又干擾分析結果。SELECT DISTINCT 語句便是那把高效的篩子&#xff0c;助您快速剔除冗余&#xff0c;提取唯一值。本文…

16-產品經理-需求的評審

在創建需求的時候&#xff0c;有一個"不需要評審"的復選框&#xff0c;如果選中該復選框的話&#xff0c;需求的創建成功后狀態是激活的。 但大部分情況下面&#xff0c;需求還是需要評審的。 即使產品完全由一個人負責&#xff0c;也可以將一些不成熟的想法存為草…