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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…