第20讲:Python列表、元组、字符串使用自定义排序规则

news2024/12/23 18:28:26

文章目录

    • 1.自定义排序方法
    • 2.常用作自定义排序的函数、方法
    • 3.列表、元组、字符串自定义排序方法
      • 3.1.当列表、元组中元素为字符串的排序规则
      • 3.2.三者采用str.lower方法实现自定义排序
      • 3.2.三者采用len函数实现自定义排序

1.自定义排序方法

列表、元组、字符串都可以进行排序,列表和元组进行排序时,如果有元素是字符串时,列表、元组中的所有元素都需要用引号引起来,例如:mytuple = ("jiangxl", "11"),否则将会抛出错误,如下所示,调用sorted函数排序时,不明确要对字符串排序还是数字排序,从而就会抛出异常,如果都加上引号了,sorted函数就认为是对字符串进行排序。

image-20220804163826996

在前面我们使用的都是sorted函数默认的排序规则,在调用sorted函数时,还可以指定参数key = 函数名 或者 key = 类名.方法名指定某个函数或者是类中的方法,然后分别调用指定的函数或者方法对字符串中的所有字符、列表元组中的所有元素进行计算,然后根据函数或者方法的返回值进行排序,排序完成后再逆推出原始字符,从而实现自定义的排序规则。

如下图所示,这是字符串排序过程中,调用sorted函数时指定了key = str.lower参数,str是字符串的类,lower是str类中的函数,在类中的函数就被称为方法,调用sorted函数时指定了参数key,就相当于自定义排序方法了,根据指定的函数或者方法对字符串中的所有字符、列表元组中的所有元素进行计算,将返回的结果再进行排序,最后再根据排序的返回值逆推出原始值。

看下图,字符串DBeFac在排序过程中,调用sorted函数时指定了key = str.lower参数,此时字符串中的所有字符都会使用str.lower这个方法进行的处理并得到一个返回值dbefac,然后根据str.lower方法得到的返回值进行排序,排序完成后还需要根据返回值逆推出实际原始值,也就是通过str.lower方法处理之前的原始值,最后将排序输出到控制台。

简单来说,自定义排序就是在调用sorted函数时指定参数key,在key中声明一个函数或者方法,然后通过这个函数对字符串、列表、元组中的每个元素进行处理并得到一个返回值,然后对这个返回值进行排序,排序后再逆推出返回值的原始值,最终将排序结果输出到屏幕。

2.常用作自定义排序的函数、方法

在自定义排序时常用的函数或者方法有:

  • str.lower方法
    • 在上面讲解自定义排序方法实,图中的案例在调用sorted函数时指定参数key = str.lowerstr.lower方法是将指定的字符转换成小写字母,后续进行排序时,就是对转换后的小写字母的ordinal value值进行比较排序。
  • len函数
    • len函数主要在列表、元组自定义排序时使用,通过len函数可以计算一个字符串的长度,我们可以通过len函数计算出一个元素的长度,然后根据元素的长度进行排序。

1)str.lower方法的使用

print(str.lower("ABCefDj"))

#输出结果:abcefdj

2)len函数的使用

print(len("ABCefDj"))

#输出结果:7

3.列表、元组、字符串自定义排序方法

3.1.当列表、元组中元素为字符串的排序规则

字符的排序是根据其ordinal value值作为依据的,字符的ordinal value值是一个整数,排序的默认情况下是从 小到大。

当列表的元素都是字符串时,按照字符串排序有一定的复杂性,但是也不难,过程分为如下几步:

  • 首先将列表中的字符串元素看成是一个子串,子串的特性是依据子串中的第一个字符,但是字符串元素又不会只依据第一个字符,和字符串比较很相似,可以结合着学习。
  • 排序过程中会根据每个元素中字符串的第一个字符的ordinal value值进行排序,如果多个字符串的第一个字符的ordinal value值相同,相当于并列了,但是也要分出个高低,此时就会根据字符串中第二个字符的ordinal value值进行排序,只要分出个大于小,然后根据从小到的顺序进行排序。

主要是理解列表中元素全都是字符串时,它的一个排序规则,当然只要是进行列表的排序,要么纯数字,要么纯字符串,如果纯数字那么就很好排序的,只要涉及到了字符串,无论列表中的元素是字符串还是数字,数字也会被看成字符串,数字也有对应的ordinal value值,此时都需要依据字符串中字符的ordinal value值进行排序,首先比较字符串中第一个字符的ordinal value值,如果字符串与字符串之间的第一个字符ordinal value值相等,那么就看第二个字符的ordinal value值,直到比较出谁大谁小,最后按照从小到大的顺序排序。

采用str.lower方法自定义排序,排序的规则还是一样的,只不过使用str.lower方法后,会对原始的字符串进行处理,处理之后的排序顺序又是另外一个样子,因为str.lower方法会将大写的字符转换成小的字符,小写字符的ordinal value值要比大写字符的ordinal value值大,从而肯定会和不加str.lower方法的默认排序结果有所不同。

如下图所示,有一个列表:["jiangxl", "Book", "baidu", "csdn", "123", "67896"],要使用自定义排序规则,方法是str.lower,首先会通过str.lower方法将列表中大写字母的字符全部转换成小写,如图中第二层所示,Book被转换成小写的book,转换之后该元素的排序就发生了很大的变量,因为其的第一个字符的ordinal value值也随之增大了。

字符由大写转换成小写,就是str.lower方法处理的结果,然后按照这个返回结果去排序,每个字符串取第一个字符的ordinal value值进行比较与排序,book和baidu元素的第一个字符都相同,那么就按照第二个字符的ordinal value值进行比较,ordinal value值是数字,得到每个元素对应的ordinal value值之后,就可以进行排序了。

按照ordinal value值排序完之后,结果就是下图中的第四层,这些字符串还是str.lower方法的返回值,还需要通过逆推将其转换成原始字符串,最终的排序结果就如下图中的第五层所示。

接下来我们会去实现这个排序。另外元组中的元素是字符串时,也是这种排序规则,并且如果也用str.lower自定义排序,过程也是如上所示,没有任何区别。

image-20220804203135370

本小结只是说了列表和元素中字符串的排序规则,那么字符串中的字符是如何排序的?前面已经讲过了,这里在重复一遍,字符串中的每个字符的个数拥有都是1个,只要根据其的ordinal value值进行排序即可。

3.2.三者采用str.lower方法实现自定义排序

1)列表采用str.lower方法实现自定义排序

#列表采用str.lower函数实现自定义排序
#升序
mylist = ["jiangxl", "Book", "baidu", "csdn", "123", "67896"]
print(sorted(mylist, key=str.lower))
#输出结果:['123', '67896', 'baidu', 'Book', 'csdn', 'jiangxl']			排序过程已在上面详细讲了

#降序
print(sorted(mylist, key=str, reverse=True))
#输出结果:['jiangxl', 'csdn', 'baidu', 'Book', '67896', '123']

也可以参照下图每个元素的字符ordinal value值,去分析谁应该在前,谁应该在后。

image-20220804203724680

2)元素采用str.lower方法实现自定义排序

效果和列表一样。

#元组采用str.lower函数实现自定义排序
#升序
mytuple = ("Jiangxl", "Kubernetes", "Jenkins")
print(sorted(mytuple, key=str.lower))
#输出结果:['Jenkins', 'Jiangxl', 'Kubernetes']

#降序
print(sorted(mytuple, key=str.lower, reverse=True))
#输出结果:['Kubernetes', 'Jiangxl', 'Jenkins']

3)字符串采用str.lower方法实现自定义排序

字符串中每个字符的个数都是一个,直接根据这个字符的ordinal value值进行排序。

#字符串采用str.lower函数实现自定义排序
#升序
mystr = "jiangxl"
print(sorted(mystr, key=str.lower))
#输出结果:['a', 'g', 'i', 'j', 'l', 'n', 'x']

#降序
print(sorted(mystr, key=str.lower, reverse=True))
#输出结果:['x', 'n', 'l', 'j', 'i', 'g', 'a']

列表、元组、字符串通过str.lower方法排序的结果。

image-20220804204649259

3.2.三者采用len函数实现自定义排序

首先根据len函数计算出每个元素的长度,然后根据返回的值进行排序,返回值都是一个整数,默认从小到大排序,排序完成后在按照逆推的方法获取原始字符串,最终输出控制台。

image-20220804205417334

1)列表采用len函数实现自定义排序

#列表采用len函数实现自定义排序
#升序
mylist = ["jiangxl", "Book", "baidu", "csdn", "123", "67896"]
print(sorted(mylist, key = len))

#输出结果:['123', 'Book', 'csdn', 'baidu', '67896', 'jiangxl']

'''
	jiangxl元素通过len计算出的长度为7,Book元素的长度为4,baidu元素的长度为5,csdn元素的长度为4,123元素的长度为3,67896元素的长度为5
	从小到大依次是 3 4 4 5 5 7
	逆推回的原始值就是 ['123', 'Book', 'csdn', 'baidu', '67896', 'jiangxl']
'''

#降序
print(sorted(mylist, key=len, reverse=True))

#输出结果:['jiangxl', 'baidu', '67896', 'Book', 'csdn', '123']

image-20220804172129815

2)元组采用len函数实现自定义排序

#元组采用len函数实现自定义排序
#升序
mytuple = ("Jiangxl", "Kubernetes", "Jenkins")
print(sorted(mytuple, key=len))

#输出结果:['Jiangxl', 'Jenkins', 'Kubernetes']

#降序
print(sorted(mytuple, key=len, reverse=True))

#输出结果;['Kubernetes', 'Jiangxl', 'Jenkins']

image-20220804172924967

3)字符串采用len函数实现自定义排序

字符串使用len函数排序的意义不大,因为字符串中的每个字符长度都为1,如下所示。

mystr = "jiangxl"
print(sorted(mystr, key=len))
print(sorted(mystr, key=len, reverse=True))

#输出结果:['j', 'i', 'a', 'n', 'g', 'x', 'l']
#意义不大,将每个字符按照书序一次列了出来,无论升序还是倒序,顺序都不变。

image-20220804193230127

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/360843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

友元的学习

😁友元的简介类的主要特点之一是数据隐藏,即类的私有成员无法在类的外部作用域之外访问,但是,有时候需要在类的外部访问类的私有成员,这个时候就需要使用友元函数。友元函数是一种特权函数,c允许这哥特权函…

分享在线预约系统制作步骤_在线预约链接怎么做

在微信小程序上进行在线预约,不管是商家还是顾客,都可以自由选择时间,顾客还可以通过预约小程序,了解到所选服务的详情和功能特色,不必等到去店内听介绍,顾客能节省等候时间,商家能解放招待人力…

解决:Vmware Workstation 和 Vmware ESXI 创建虚拟机Ubuntu20.04时界面显示不全,无法点击Continue进行下一步

目录 Vmware Workstation Vmware ESXI Vmware Workstation 1.如下图,到了这一步可以按 CTRL ALT T 调出命令终端 2. 终端输入 xrandr --size 1280x800 此命令是调整屏幕大小 3.此时已经显示屏幕完整信息 Vmware ESXI 安装workstation时那种调整界面大小的方…

每日学术速递2.21

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.T2I-Adapter: Learning Adapters to Dig out More Controllable Ability for Text-to-Image Diffusion Models 标题:T2I-Adapter:学习Adapter,为…

2022年网络安全政策态势分析与2023年立法趋势

近日,公安部第三研究所网络安全法律研究中心与 360 集团法务中心联合共同发布了《全球网络安全政策法律发展年度报告(2022)》。《报告》概览2022年全球网络安全形势与政策法律态势,并对2023年及后续短期内网络安全政策、立法趋势进…

【微信小程序】原生微信小程序ts模板下引入vant weapp

之前一直是在普通项目下使用 vant weapp,这不最近学了ts,使用微信开发工具的tsless初始化项目,再引入 vant 时踩了好久坑,特来记录一下 前言 本文章适合微信开发工具的ts项目,指的是项目目录结构如下图 总结 从上图…

Leetcode.1401 圆和矩形是否有重叠

题目链接 Leetcode.1401 圆和矩形是否有重叠 Rating : 1709 题目描述 给你一个以 (radius, xCenter, yCenter)表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2),其中 (x1, y1)是矩形左下角的坐标,而 (x2, y2)是右上角的坐标。 如果圆和矩…

【重点掌握】Java基础之Javaweb核心技术详解

都说一入Java深似海,从此代码是爱人,但是学习的过程却从来都不轻松。当下,越来越多的互联网企业,招聘Java工程师时,明确写道需熟练掌握JavaWeb技术。作为衔接前后端的重要一环,JavaWeb技术已成为程序员向大…

Linux线程调度实验

Linux线程调度实验 1.获取线程属性 #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <pthread.h> #include <time.h> #include <stdlib.h> #include <errno.h> #define _GNU_SOURCE#define handle_error…

Power Apps 中判断用户的SharePoint Online Group权限

前言 最近&#xff0c;碰到一个棘手的问题&#xff0c;就是用户有个需求&#xff0c;就是想在Power Apps中判断一个用户是不是在某些AD安全组中。 通常&#xff0c;这样的情况&#xff0c;都需要去AAD中进行判断&#xff0c;判断这个人在不在某些组中&#xff0c;有Graph API可…

双因素方差分析全流程

上篇文章讲述了“单因素方差分析全流程总结”&#xff0c;单因素方差分析只是考虑了一个自变量&#xff08;定类&#xff09;与一个因变量&#xff08;定量&#xff09;之间的关系&#xff0c;但是在实际问题研究中可能研究两个或者几个因素与因变量之间的关系&#xff0c;例如…

监管持续,医疗卫生机构如何守好“涉疫”数据安全?

肆虐三年的新冠疫情&#xff0c;影响着全球经济发展、社会正常运行&#xff0c;也成为网络攻击、勒索软件攻击快速增长的温床&#xff0c;“滋生”了一系列网络、数据安全问题&#xff0c;受到各界关注。最近&#xff0c;上线运行三年的 “粤康码”发布公告、官宣部分服务下线&…

C++——map和set的应用总结

目录1. 关联式容器2. 键值对3. 树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的使用3.2 multiset3.2.1 multiset的介绍3.2.2 multiset的使用3.3 map3.3.1 map的介绍3.3.2 map的使用operator[]3.4 multimap3.4.1 multimap的介绍3.4.2 multimap的使用3.5 map和set在OJ中的…

想知道车牌号码里都有什么秘密吗?

当我们看到一辆车时你会优先关注的是什么呢&#xff1f;关注它的外形还是LOGO?这个需要看你的角色定位&#xff0c;如果你是商人可能关注的方向是车的品牌&#xff0c;如果是警察可能关注的就是车牌号码。 因为&#xff0c;车牌号里的信息是很丰富的&#xff0c;可以通过查询车…

万物皆可集成资源包!低代码集成系列一网打尽

如何花最短的时间、用最少的成本解决客户的企业级应用定制问题&#xff1f; 如何满足数据库集成、Web API集成、第三方软件集成等需求&#xff0c;在如今万物皆可盘的当下&#xff0c;低代码如何用积木大玩具的方式快速构建各种应用&#xff0c;实现“万物皆可集成”&#xff…

C语言【柔性数组】

柔性数组&#x1fac5;什么是柔性数组&#x1fac5;柔性数组的使用&#x1fac5;柔性数组的优势&#x1fac5;什么是柔性数组 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。 C99 中&#xff0c;结构中的最后一…

ES6的迭代器与迭代协议Symbol.iterator

前言ES6新增了两个协议&#xff1a;可迭代协议&#xff1a;对象必须具有Symbol.Iterator属性&#xff0c;属性值为一个函数&#xff0c;当这个对象被迭代时&#xff0c;就会调用该函数&#xff0c;返回一个迭代器。迭代器协议&#xff1a;描述了迭代器对象的具体规则。迭代器迭…

ubuntu的文件系统结构

一. ubuntu 系统的根目录“/” Linux 系统下 “/” 就是系统的根目录&#xff0c;所有的目录是由根目录衍生出来的。 进入根目录的方法&#xff1a;终端输入" cd / " 命令。如下所示&#xff1a; 二. ubuntu 文件系统结构 /bin: 存放二进制的可执行文件。所谓…

【项目实战】接入极光推送SDK,实现从Java服务端后台推送自定义消息到Android车机端

一、需求描述 项目中需要接入极光推送SDK&#xff0c;实现从Java服务端推送消息到Android车机端&#xff0c;以下实现的功能主要是安卓端的&#xff0c;IOS端的虽然代码也兼容了&#xff0c;但是不在本次讨论范围内。以下是具体的实现过程。 二、极光推送介绍 极光推送是一款…

《Qt6开发及实例》6-4 显示SVG格式图片

目录 一、简介与设计 1.1 简介 1.2 设计 二、SvgWidget 2.1 鼠标滚轮事件 三、svgwindow 四、MainWindow 一、简介与设计 1.1 简介 1、SVG 的英文全称是 Scalable Vector Graphics&#xff0c;即可缩放的矢量图形。它是由万维网联盟&#xff08;W3C&#xff09;在 200…