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迭代用法实例教程
Sep 08 Python
对于Python的框架中一些会话程序的管理
Apr 20 Python
Python实现的朴素贝叶斯分类器示例
Jan 06 Python
基于pandas数据样本行列选取的方法
Apr 20 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
Jul 18 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
Oct 14 Python
用scikit-learn和pandas学习线性回归的方法
Jun 21 Python
python爬虫-模拟微博登录功能
Sep 12 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
Feb 25 Python
Python实现冒泡排序算法的完整实例
Nov 04 Python
Python基础之函数嵌套知识总结
May 23 Python
python中pycryto实现数据加密
Apr 29 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
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
PHP使用token防止表单重复提交的方法
2016/04/07 PHP
PHP制作登录异常ip检测功能的实例代码
2016/11/16 PHP
php操作access数据库的方法详解
2017/02/22 PHP
用jQuery模拟页面加载进度条的实现代码
2011/12/19 Javascript
JavaScript自执行闭包的小例子
2013/06/29 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
2015/08/26 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
vue新建项目并配置标准路由过程解析
2019/12/09 Javascript
vue 动态添加class,三个以上的条件做判断方式
2020/11/02 Javascript
python3访问sina首页中文的处理方法
2014/02/24 Python
python采集博客中上传的QQ截图文件
2014/07/18 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
html Table 表头固定的实现
2019/01/22 HTML / CSS
职专应届生求职信
2013/11/16 职场文书
后勤采购员岗位职责
2013/12/19 职场文书
一位农村小子的自荐信
2014/04/07 职场文书
清明节演讲稿
2014/05/27 职场文书
工会优秀工作者事迹
2014/08/17 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书