Python的sort()與sorted()排序函數的區別

文章目錄

  • 一、工具
  • 二、需求
  • 三、簡單的使用例子
  • 四、原理分析
    • Timsort算法主要特點:
    • Timsort算法的工作原理:
    • `sort()` 方法和 `sorted()` 函數的差異:
  • 五、Python中的單例實現簡單示例

一、工具

Python 3.10.0
pycharm 2022

二、需求

最近做項目的時候用到了這兩個函數,以前沒注意,仔細研究一下,這兩個函數還是有很大區別的

三、簡單的使用例子

在Python中,你可以使用內置的sort()方法或者sorted()函數對列表進行排序。

  1. sort() 方法 - 會修改原始列表,使其元素按照一定順序排列。默認情況下,排序是升序的。
my_list = [3, 1, 4, 1, 5, 9, 2, 6]
my_list.sort()
print(my_list)  # 輸出: [1, 1, 2, 3, 4, 5, 6, 9]

如果你要按照降序排序,可以傳遞一個參數reverse=Truesort()方法:

my_list = [3, 1, 4, 1, 5, 9, 2, 6]
my_list.sort(reverse=True)
print(my_list)  # 輸出: [9, 6, 5, 4, 3, 2, 1, 1]

你還可以提供一個自定義的關鍵字參數key來實現自定義排序邏輯:

my_list = ['apple', 'banana', 'cherry', 'date']
my_list.sort(key=len)  # 根據字符串長度排序
print(my_list)  # 輸出: ['date', 'apple', 'banana', 'cherry']
  1. sorted() 函數 - 會返回一個新的列表,并且不會改變原始的列表。用法和sort()類似,但是它可以用于任何可迭代對象:
my_list = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_list = sorted(my_list)
print(sorted_list)  # 輸出: [1, 1, 2, 3, 4, 5, 6, 9]

同樣地,你也可以使用reversekey參數:

my_list = ['apple', 'banana', 'cherry', 'date']
sorted_list = sorted(my_list, key=len, reverse=True)
print(sorted_list)  # 輸出: ['banana', 'cherry', 'apple', 'date']

這里的len是Python內置函數,用來獲取列表中每個元素的長度作為排序的依據(即排序鍵)。sort()和sorted()都支持自定義的函數作為key參數,這允許你進行更復雜的排序操作。

選擇sort()方法還是sorted()函數取決于是否需要保留原始列表不變,以及是否需要對任意可迭代對象進行排序

四、原理分析

在Python中,sort()方法和sorted()函數背后的排序機制是基于Tim Peters開發的Timsort算法。Timsort是一種混合型排序算法,它源自歸并排序(Merge Sort)和插入排序(Insertion Sort)。Timsort算法在2002年被引入到Python中,并且因為其卓越性能成為Python的默認排序算法。

Timsort算法主要特點:

  1. 穩定性:如果列表中存在相等的元素,它們原始的順序不會改變。
  2. 自適應性:在接近排好序的數據集上表現更佳。
  3. 復雜度: 最壞情況時間復雜度為O(n log n)。 最優情況(已經排好序的數據集)時間復雜度為O(n)。 平均情況時間復雜度也是O(n log n)。

Timsort算法的工作原理:

  1. 查找或創建自然運行:Timsort首先遍歷數據,查找自然有序的小段,稱為“運行”(runs),這些可以是已經排好序的子列表。如果沒有找到足夠大小的運行,則使用二分插入排序將它們擴展到最小運行大小(通常為32或64個元素)。這一步驟允許算法利用輸入數據中的任何固有順序。

  2. 運行堆積(Run Stacking):一旦識別出所有的運行之后,Timsort會按照一定規則將它們合并,直到只剩下一個運行為止。這個過程中,Timsort會盡可能地合并那些長度相近的相鄰運行。

  3. 歸并排序:合并過程是通過歸并排序完成的,這是一種將兩個或多個有序列表組合成單一有序列表的技術。通過重復此過程,直到整個數組變得有序。

sort() 方法和 sorted() 函數的差異:

  1. sort() 方法:

是列表(list)的內置方法。
會就地(in-place)對列表進行排序,即不需要額外的存儲空間來創建新列表,但原始列表內容會被改變。
2. sorted() 函數:

是內建函數,可以對任意可迭代對象進行排序操作。
返回一個新的列表,原始輸入數據不會被修改。
盡管sort()和sorted()使用相同的排序算法(Timsort),它們在數據處理方式上存在差異,體現在是否會改變原始數據以及它們各自的適用范圍。

在高級實現中,Timsort還涉及很多優化措施,比如對小數組使用插入排序、合并時考慮已排序的序列以及優化的比較和移動過程等。這些細微的優化使得Timsort成為一種非常快速且高效的排序算法,在現代編程語言中得到廣泛采用。

五、Python中的單例實現簡單示例

要實現一個只需實例化一次的類,你可以使用設計模式中的單例模式。在Python中,有多種方式實現單例模式。下面給出兩種常見的實現方式:

  1. 使用類變量:
class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if cls._instance is None:cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)return cls._instance# 使用示例
singleton1 = Singleton()
singleton2 = Singleton()assert singleton1 is singleton2  # 檢查singleton1和singleton2是否是同一個實例

在這個例子中,我們重寫了__new__方法,它是在創建實例之前被調用的特殊方法。__new__方法確保只創建單例類的一個實例,并且后續嘗試創建新實例時都返回第一個創建的實例。

  1. 使用裝飾器:
def singleton(cls):instances = {}def get_instance(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return get_instance@singleton
class MySingleton:pass# 使用示例
singleton1 = MySingleton()
singleton2 = MySingleton()assert singleton1 is singleton2  # 檢查singleton1和singleton2是否是同一個實例

在這個例子中,我們使用了一個裝飾器singleton,它接收一個類并返回一個函數get_instance。這個函數檢查該類是否已經有一個實例存在于字典instances中,如果不存在就創建一個新的實例。如果已經存在,就返回那個實例。當你用@singleton裝飾一個類時,你實際上把這個類替換成了get_instance函數。

兩種方法都能夠確保一個類在程序運行期間只有一個實例。選擇哪種方式取決于你的具體需求和偏好。

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

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

相關文章

微服務學習:RestTemplateWebClient發起的http請求實現遠程調用

http請求做遠程調用是與語言無關的調用,只要知道對方的ip,端口,接口路徑,請求參數即可 啟動類中配置: Beanpublic RestTemplate restTemplate(){return new RestTemplate();} Sevice中書寫方法 get Autowiredprivate RestTemp…

2023-2024 年重慶市職業院校技能大賽 高職組“軟件測試”賽項樣題

2023-2024 年重慶市職業院校技能大賽 高職組“軟件測試”賽項樣題 單元測試要求分析、代碼設計、設計測試數據、編寫測試腳本和 測試執行等;測試計劃、測試報告文檔設計與編寫;Web 端測試用例 設計、測試執行和 Bug 記錄; 自動化測試要求分析…

點擊按住說話按鈕事件有延遲

問題原因: 該問題原因是由于系統的某些手勢 delaysTouchesBegan 屬性為 YES,當按鈕處在某些特定位置時觸摸事件會先被這些系統的手勢攔截,系統不響應才會繼續分發,而按鈕的 UIControlEventTouchDown 事件是需要立即響應的&#xf…

Python數據處理的六種方式總結,Python零基礎學習

文章目錄 前言1、dedup()去重并排序2、traverse()拆分嵌套數組3、filter()數據篩選4、groupby()分組運算5、select()遍歷結果集6、sort()數據排序 總結 前言 在 Python 的數據處理方面經常會用到一些比較常用的數據處理方式,比如pandas、numpy等等。 今天介紹的這…

vue圖片預覽 90度旋轉

要在 Vue 3 中實現點擊按鈕讓圖片旋轉 90 度&#xff0c;你可以使用 CSS 轉換和 Vue 的事件處理來完成。這里是一個基本的示例&#xff1a; 首先&#xff0c;在你的組件的模板中&#xff0c;添加一個按鈕和一個應用轉換的圖像&#xff1a; <template> <div> <…

使用粗糙貼圖制作粗紋皮革手提包3D模型

在線工具推薦&#xff1a; 3D數字孿生場景編輯器 - GLTF/GLB材質紋理編輯器 - 3D模型在線轉換 - Three.js AI自動紋理開發包 - YOLO 虛幻合成數據生成器 - 三維模型預覽圖生成器 - 3D模型語義搜索引擎 當談到游戲角色的3D模型風格時&#xff0c;有幾種不同的風格&#xf…

UniGui使用CSS優化PageControl

如題直接上代碼 .x-tab-bar-default-top{background-image:none!important;background-color:#FFF !important;border-color:#f0f0f0 !important;border-left:none!important;border-right:none!important}.x-tab-bar-strip-default{border-color:#f0f0f0 !important;backgrou…

Redisson出現問題總結

org.redisson.client.RedisAuthRequiredException: NOAUTH Authentication required… channel: 出現此問題的原因為沒有redis權限。解決方案在setAddress()后面加上setPassword()方法。 config.useSingleServer().setAddress("redis://localhost:6379").setPasswo…

Hugging Face 給普通用戶提供了一個 2 vCPU 16GB 的免費空間

Hugging Face 給普通用戶提供了一個 2 vCPU 16GB 的免費空間&#xff0c;并且支持部署 Gradio 構建的應用程序&#xff0c;非常方便&#xff0c;下面我們進入 https://huggingface.co/spaces/ &#xff0c;點擊創建空間。

MySQL一 | SQL語句

目錄 DDL語句 查詢所有數據庫 查詢當前數據庫 切換數據庫 創建數據庫 創建表 刪除表 查詢當前數據庫所有表 查詢表結構 查詢指定表的鍵表語句 添加字段 修改數據類型 修改字段名和字段類型 刪除字段 修改表名 刪除表 刪除指定表&#xff0c;并重新創建該表…

CCF: 202012-2 期末預測之最佳閾值--C++

#include<iostream> #include<bits/stdc.h>using namespace std;int main() {int n;//m位同學的數據int y[100001];//記錄m位同學的安全指數int result[100001];//記錄m位同學最后的掛科情況cin>>n;for(int i1;i<n;i){cin>>y[i]>>result[i];}…

unity 模型生成PNG圖片并導出(可以任意控制方向和大小,本文提供三種方案)

提示&#xff1a;文章有錯誤的地方&#xff0c;還望諸位大神不吝指教&#xff01; 文章目錄 前言一、插件RuntimePreviewGenerator&#xff08;方案一&#xff09;二、unity 官方提供的接口&#xff08;方案二&#xff09;三、方法三&#xff0c;可以處理單個模型&#xff0c;也…

華為OD機試真題-智能成績表-2023年OD統一考試(C卷)

題目描述: 小明來到某學校當老師,需要將學生按考試總分或單科分數進行排名,你能幫幫他嗎? 輸入描述: 第1行輸入兩個整數,學生人數n和科目數量m。0<n<100,0<m<10 第2行輸入m個科目名稱,彼此之間用空格隔開。科目名稱只由英文字母構成,單個長度不超過10個字符…

Linux下C++靜態鏈接庫的生成以及使用

目錄 一.前言二.生成靜態鏈接庫三.使用靜態鏈接庫 一.前言 這篇文章簡單討論一下Linux下如何使用gcc/g生成和使用C靜態鏈接庫&#xff08;.a文件&#xff09;。 二.生成靜態鏈接庫 先看下目錄結構 然后看下代碼 //demo.h#ifndef DEMO_H #define DEMO_H#include<string&g…

線程狀態:深入理解多任務并發編程中的精髓

目錄 引言 1. 線程狀態概述 1.1 定義 1.2 線程狀態圖 2. 線程狀態的轉換 2.1 新建到就緒 2.2 就緒到運行 2.3 運行到阻塞 2.4 運行到等待和超時等待 2.5 運行到終止 3. 實際編程中的線程狀態管理 3.1 合理使用wait()和notify() 3.2 謹慎處理阻塞狀態 3.3 使用線程…

面試題之Docker篇

1、Docker 是什么&#xff1f; Docker一個開源的應用容器引擎&#xff0c;是實現容器技術的一種工具&#xff0c;讓開發者可以打包他們的應用以及環境到一個鏡像中&#xff0c;可以快速的發布到任何流行的操作系統上。 2、Docker的三大核心是什么? 鏡像&#xff1a;Docker的鏡…

Elastic Support Hub 轉向語義搜索

作者&#xff1a;Chris Blaisure 我們很高興與大家分享 Elastic Support Hub 最近的增強功能&#xff1a;它現在由語義搜索提供支持&#xff01; 但在我們更詳細地了解對 Elastic Support Hub 所做的更改及其對客戶的影響之前&#xff0c;我們需要花點時間解釋語義搜索的概念&…

el-form表單校驗值為0提示校驗不通過

el-form表單校驗輸入框值為0時提示校驗不通過 配置validator自定義校驗方法 這里舉例在結構代碼里加入校驗規則 <el-form-item:prop"num":rules"[{required: true,message: 請輸入數量,trigger: change,},{validator,trigger: blur}]" ><el-inpu…

【安卓】安卓xTS之Media模塊 學習筆記(3) VTS測試

1. 背景 接下來進行正式的VTS測試。本章節還是以Media模塊相關進行介紹。 VTS主要測的是內核和HAL層&#xff0c;media的hal層是以openMax&#xff08;即將廢棄&#xff0c;今日2023.12&#xff09; 和 Codec2 (后續主流) 接口為主。 這里我們只看Codec2的要求&#xff0c;CDD…

統計字符

輸入一行字符&#xff0c;分別統計出包含英文字母、空格、數字和其它字符的個數。 數據范圍&#xff1a;輸入的字符串長度滿足1≤n≤1000 輸入描述&#xff1a;輸入一行字符串&#xff0c;可以有空格 輸出描述&#xff1a;統計其中英文字符&#xff0c;空格字符&#xff0c;數…