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 相关文章推荐
详解Python编程中time模块的使用
Nov 20 Python
Python 实现一行输入多个值的方法
Apr 21 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
May 11 Python
python实现简易数码时钟
Feb 19 Python
Python实现Linux监控的方法
May 16 Python
使用python实现对元素的长截图功能
Nov 14 Python
Python Numpy数组扩展repeat和tile使用实例解析
Dec 09 Python
flask 框架操作MySQL数据库简单示例
Feb 02 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 Python
Django实现随机图形验证码的示例
Oct 15 Python
用Python制作音乐海报
Jan 26 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防止注入攻击实例分析
2014/11/03 PHP
PHP读取文件的常见几种方法
2016/11/03 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
2016/06/13 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
2017/04/13 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
在pytorch中查看可训练参数的例子
2019/08/18 Python
python实现复制大量文件功能
2019/08/31 Python
Python列表元素常见操作简单示例
2019/10/25 Python
python创建n行m列数组示例
2019/12/02 Python
python自定义函数def的应用详解
2020/06/03 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
中专生求职自荐信范文
2013/12/22 职场文书
2014年计算机专业个人自我评价
2014/01/19 职场文书
目标责任书范文
2014/04/14 职场文书
校园文化标语
2014/06/18 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
讲解Python实例练习逆序输出字符串
2022/05/06 Python