Python3实现对列表按元组指定列进行排序的方法分析


Posted in Python onDecember 22, 2018

本文实例讲述了Python3实现对列表按元组指定列进行排序的方法。分享给大家供大家参考,具体如下:

Python版本: python3.+
运行环境: Mac OS
IDE: pycharm

Python内建的排序方法

1 排序方法介绍

Python中有2个排序函数,一个是list内置的sort()方法,另一个是全局的sorted()方法

sorted(iterable,key=None,reverse=False) #返回排好序的新列表,不改变对象本身,默认升序;reverse:-True降序 -False 正序对所有可迭代的对象均有效
list.sort(key=None,reverse=False) #将list自身进行排序,不返回新的list对象,默认升序;reverse:-True降序 -False 正序

2 基本的列表排序

1)list.sort()排序

data = [5, 7, 9, 3, -6, -7, -8, -9, 3, -8]
result = data.sort()
print(data) #结果为 [-9, -8, -8, -7, -6, 3, 3, 5, 7, 9]
print(result) #结果为None

2)sorted()排序

data = [5, 7, 9, 3, -6, -7, -8, -9, 3, -8]
result = sorted(data)
print(data) #结果为 [5, 7, 9, 3, -6, -7, -8, -9, 3, -8]
print(result) #结果为 [-9, -8, -8, -7, -6, 3, 3, 5, 7, 9]

3 以tuple作为list的元素

在默认情况下sort和sorted函数接收的参数是元组时,它将会先按元组的第一个元素进行排序再按第二个元素进行排序,再按第三个、第四个…依次排序。

我们通过一个简单的例子来了解它,以下面这个list为例:

data = [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]

我们通过sorted()对它进行排序

data = [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
result = sorted(data)
print(data) #结果为 [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
print(result) #结果为 [(0, 'B'), (0, 'a'), (1, 'A'), (1, 'B'), (2, 'A')]

会发现排序后的结果中(0, 'B')在(0, 'a')的前面。这是因为在按元组第一个元素排好之后,将(0, 'B'), (0, 'a')再按第二个元素进行排序了,而'B'的ASCII编码比'a'小,所以(0, 'B')就排在(0, 'a')的前面了。

那如何想要让它排序时不分大小写呢?

这就要用到sort方法和sorted方法里的key参数了。

我们来看一下具体的实现:

data = [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
#利用参数key来规定排序的规则
result = sorted(data,key=lambda x:(x[0],x[1].lower()))
print(data) #结果为 [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
print(result) #结果为 [(0, 'a'), (0, 'B'), (1, 'A'), (1, 'B'), (2, 'A')]

其中的lambda x:(x[0],x[1].lower()可以理解为一个匿名函数;

其功能类似于:

def fun(x)
  return(x[0],x[1].lower())

如果想要以字母作为第一排序规则,并且字母大小写不敏感,该怎么实现?

这就能要运用到之前所讲到的

在默认情况下sort和sorted函数接收的参数是元组时,它将会先按元组的第一个元素进行排序再按第二个元素进行排序,再按第三个、第四个…依次排序。

再配合lambda返回一个自定义tuple;代码如下:

data = [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
#将x[1].lower()作为返回元组里的第一个元素,按照sorted的排序规律,就会先按字母排序,再按数字排序了
result = sorted(data,key=lambda x:(x[1].lower(),x[0]))
print(data) #结果为 [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
print(result) #结果为 [(0, 'a'), (1, 'A'), (2, 'A'), (0, 'B'), (1, 'B')]

4 [扩展] 以dict作为list的元素

这个list里的元素是dict形式,每个dict都存有姓名和升高现在想要以升高进行升序排列:

data = [{'name': '张三', 'height': 175}, {'name': '李四', 'height': 165}, {'name': '王五', 'height': 185}]
#将x['height']最为返回tuple的第个一元素
result = sorted(data,key=lambda x:(x['height'],x['name']))
print(data) #结果为
print(result)
#data  结果:[{'name': '张三', 'height': 175}, {'name': '李四', 'height': 165}, {'name': '王五', 'height': 185}]
#result 结果:[{'name': '李四', 'height': 165}, {'name': '张三', 'height': 175}, {'name': '王五', 'height': 185}]
Python 相关文章推荐
简介Django框架中可使用的各类缓存
Jul 23 Python
Python3实现Web网页图片下载
Jan 28 Python
使用python爬取B站千万级数据
Jun 08 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
Python3实现的判断回文链表算法示例
Mar 08 Python
django实现支付宝支付实例讲解
Oct 17 Python
在django-xadmin中APScheduler的启动初始化实例
Nov 15 Python
Python实现哲学家就餐问题实例代码
Nov 09 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 Python
Python OpenCV超详细讲解读取图像视频和网络摄像头
Apr 02 Python
Python写情书? 10行代码展示如何把情书写在她的照片里
Apr 21 Python
Python Flask实现进度条
May 11 Python
python代码 输入数字使其反向输出的方法
Dec 22 #Python
在Python中Dataframe通过print输出多行时显示省略号的实例
Dec 22 #Python
浅谈Pandas:Series和DataFrame间的算术元素
Dec 22 #Python
对Python3.x版本print函数左右对齐详解
Dec 22 #Python
对pandas的算术运算和数据对齐实例详解
Dec 22 #Python
Python使用pandas对数据进行差分运算的方法
Dec 22 #Python
利用arcgis的python读取要素的X,Y方法
Dec 22 #Python
You might like
php xfocus防注入资料
2008/04/27 PHP
解析strtr函数的效率问题
2013/06/26 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
PHP预定义接口――Iterator用法示例
2020/06/05 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
JS 实现完美include载入实现代码
2010/08/05 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
js自动下载文件到本地的实现代码
2013/04/28 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
webpack之devtool详解
2018/02/10 Javascript
javascript实现5秒倒计时并跳转功能
2019/06/20 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
2019/09/18 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
[01:02:53]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第二局
2016/03/06 DOTA
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
python中验证码连通域分割的方法详解
2018/06/04 Python
Python列表与元组的异同详解
2019/07/02 Python
利用ImageAI库只需几行python代码实现目标检测
2019/08/09 Python
Python获取时间戳代码实例
2019/09/24 Python
python实现井字棋小游戏
2020/03/04 Python
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
数据库面试要点基本概念
2013/10/31 面试题
公务员总结性个人自我评价
2013/12/05 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
2015年药店工作总结
2015/04/20 职场文书
法律讲堂观后感
2015/06/11 职场文书
图书馆义工感想
2015/08/07 职场文书
Mysql案例刨析事务隔离级别
2021/09/25 MySQL
win10更新失败无限重启解决方法
2022/04/19 数码科技