Python 中 `sort()` 和 `sorted()` 的用法與區別

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]

解題步驟:

  1. 物品排序:首先按價格對物品進行排序。
  2. 查詢排序:按查詢值升序排列,方便按順序處理每個查詢。
  3. 增量處理:遍歷每個查詢時,使用指針 j 增量遍歷物品并更新最大美麗值。

總結:

  • sort()sorted() 都是用來排序的工具,前者是原地排序,后者返回新排序的列表。
  • sort() 適用于需要修改原始數據的情況,而 sorted() 適用于需要保留原數據并得到排序結果的情況。
  • 對于這道題,通過排序物品和查詢,并通過增量處理來實現高效的查詢答案。

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

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

相關文章

SpringBoot過濾器(Filter)的使用:Filter接口、FilterRegistrationBean類配置、@WebFilter注釋

1、過濾器(Filter)的介紹 Spring Boot 的過濾器用于對數據進行過濾處理。通過 Spring Boot 的過濾器,程序開發人員不僅可以對用戶通過 URL 地址發送的請求進行過濾處理(例如:過濾一些錯誤的請求或者請求中的敏感詞等),而且可以對服務器返回的數據進行過濾處理(例如:壓…

C++修煉之路:初識C++

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《題海拾貝》 歡迎點贊&#xff0c;關注&#xff01; 引言 …

【STM32MP157系統移植】3.TF-A目錄結構

bl1&#xff1a;部分一般不用TFA自帶的&#xff0c;而是芯片內部的BOOTROM bl2&#xff1a;更像傳統意義的TF-A&#xff0c;TF-A本身 bl31&#xff1a;是ARMV&#xff18;的EL3運行時固件 bl32&#xff1a;OPTEE或者TF-A提供的sp_min bl33&#xff1a;就是uboot 真正需要移…

OpenCV連續數字識別—可運行驗證

前言 ? 文章開始&#xff0c;瞎說一點其他的東西&#xff0c;真的是很離譜&#xff0c;找了至少兩三個小時&#xff0c;就一個簡單的需求&#xff1a; 1、利用OpenCV 在Windows進行抓圖 2、利用OpenCV 進行連續數字的檢測。 3、使用C&#xff0c;Qt 3、將檢測的結果顯示出來 …

shell的模擬實現 ─── linux第16課

在shell的命令行中輸入命令,會有兩種執行命令的途徑 shell自己執行 shell創建子進程(fork ,exit ,waitpid,exec) ,子進程去執行 shell自己執行的命令是自建命令(bulit command) 子進程執行的是非自建命令 第一版只能維護命令行參數表創建子進程, 執行非內建命令 我們先創…

MySQL創建數據庫和表,插入四大名著中的人物

一、登錄數據庫并創建數據庫db_ck 二、創建表t_hero 表屬性包括&#xff08;id&#xff0c;name&#xff0c;nickname&#xff0c;age&#xff0c;gender&#xff0c;address&#xff0c;weapon&#xff0c;types&#xff09; mysql> create table t_hero(-> id int,-…

靜態網頁的爬蟲(以電影天堂為例)

一、電影天堂的網址&#xff08;url&#xff09; 電影天堂_免費電影_迅雷電影下載_電影天堂網最好的迅雷電影下載網&#xff0c;分享最新電影&#xff0c;高清電影、綜藝、動漫、電視劇等下載&#xff01;https://dydytt.net/index.htm 我們要爬取這個頁面上的內容 二、代碼…

【C++】:STL詳解 —— 紅黑樹封裝map和set

目錄 紅黑樹的源代碼 正向迭代器的代碼 反向迭代器的代碼 set的模擬實現 map的模擬實現 紅黑樹的源代碼 #pragma once #include <iostream>using namespace std; // set ->key // map ->key/value// set ->key // map ->key/valueenum Colour {RED,BLAC…

MATLAB控制函數測試要點剖析

一、功能準確性檢驗 基礎功能核驗 針對常用控制函數&#xff0c;像用于傳遞函數建模的 tf 、構建狀態空間模型的 ss &#xff0c;以及開展階躍響應分析的 step 等&#xff0c;必須確認其能精準執行基礎操作。以 tf 函數為例&#xff0c;在輸入分子與分母系數后&#xff0c;理…

MoonSharp 文檔一

目錄 1.Getting Started 步驟1&#xff1a;在 IDE 中引入 MoonSharp 步驟2&#xff1a;引入命名空間 步驟3&#xff1a;調用腳本 步驟4&#xff1a;運行代碼 2.Keeping a Script around 步驟1&#xff1a;復現前教程所有操作 步驟2&#xff1a;改為創建Script對象 步驟…

ROS云課三分鐘-差動移動機器人導航報告如何撰寫-及格邊緣瘋狂試探

提示詞&#xff1a;基于如上所有案例并結合roslaunch teb_local_planner_tutorials robot_diff_drive_in_stage.launch和上面所有對話內容&#xff0c;設計一個差速移動機器人仿真實驗&#xff0c;并完成報告的全文撰寫。 差速移動機器人導航仿真實驗報告 一、實驗目的 驗證 T…

ACE協議學習1

在多核系統或復雜SoC&#xff08;System on Chip&#xff09;中&#xff0c;不同處理器核心或IP&#xff08;Intellectual Property&#xff09;模塊之間需要保持數據的一致性。常用的是ACE協議or CHI。 先對ACE協議進行學習 ACE協議&#xff08;Advanced Microcontroller Bu…

ajax之生成一個ajax的demo示例

目錄 一. node.js和express ?二. 使用express創建后端服務 三. 創建前端 一. node.js和express ajax是前端在不刷新的情況下訪問后端的技術&#xff0c;所以首先需要配置一個后端服務&#xff0c;可以使用node.js和express。 首先生成一個空項目&#xff0c;新建main目錄…

Java 字節碼操縱框架 -ASM

Java 字節碼操縱框架 -ASM 1.ASM 概述: ASM 是用于 Java 字節碼操縱的框架,可動態生成新類或增強現有類的功能。它既能直接產生二進制 class 文件,也能在類被加載到虛擬機之前動態改變類行為,通過讀取類文件信息來分析、修改類行為,甚至生成新類。許多流行框架如 cglib、…

kafka + flink +mysql 案例

假設你有兩個Kafka主題&#xff1a;user_activities_topic 和 product_views_topic&#xff0c;并且你希望將user_activities_topic中的數據寫入到user_activities表&#xff0c;而將product_views_topic中的數據寫入到product_views表。 maven <dependencies><!-- …

遠程登錄客戶端軟件 CTerm 發布了 v4.0.0

有時候我們需要遠程登錄到 Linux/Unix 服務器&#xff0c;這方面使用最廣泛的客戶端軟件是 PuTTY&#xff0c;不過它是全英文的&#xff0c;而且是單窗口的&#xff0c;有時候顯得不那么方便。 CTerm (Clever Terminal) 是一個 Windows 平臺下支持 Telnet 和 SSH 協議進行遠程…

從李佳琦團隊看新型用工:靈活就業如何重構組織架構?

2022年“雙11”期間&#xff0c;李佳琦直播間累計銷售額突破115億元&#xff08;來源&#xff1a;新腕數據《2022雙11直播電商戰報》&#xff09;&#xff0c;其背后團隊規模約400人&#xff0c;但全職員工僅占35%&#xff0c;其余65%為外包選品團隊、兼職客服、第三方MCN機構人…

微軟程序的打包格式MSIX

MSIX 微軟推出的MSIX格式是其為統一Windows應用程序打包和部署而設計的新一代安裝包格式&#xff0c;具有以下核心特點和進展&#xff1a; 1. 推出背景與時間線 MSIX最初于2018年在微軟Build大會上宣布&#xff0c;并在同年7月發布預覽版打包工具&#xff0c;10月正式版上線…

AFL++安裝

學習fuzzing也幾天了&#xff0c;今天記錄AFL的安裝及使用 一、實驗環境 虛擬機&#xff1a;ubuntu20.04 當然也可以uname -a去看自己的版本號 二、AFL安裝 1.先更新一下工具 sudo apt update2.安裝AFL必要的一些依賴&#xff0c;例如編譯工具&#xff08;如 build-essen…

【STM32】ADC功能-單通道多通道(學習筆記)

本章結合上一節內容復習更好理解【江協科技STM32】ADC數模轉換器-學習筆記-CSDN博客 一、ADC單通道 接線圖 ADC初始化 ①RCC開啟時鐘&#xff0c;包括ADC和GPIO的時鐘&#xff0c;另外ADCCLK的分頻器也要配置 ②配置GPIO,&#xff0c;把需要用的GPIO配置成模擬輸入模式&am…