Python sorted函数详解(高级篇)


Posted in Python onSeptember 18, 2018

sorted 用于对集合进行排序(这里集合是对可迭代对象的一个统称,他们可以是列表、字典、set、甚至是字符串),它的功能非常强大

1、对列表排序,返回的对象不会改变原列表

list = [1,5,7,2,4]

sorted(list)
Out[87]: [1, 2, 4, 5, 7]
#可以设定时候排序方式,默认从小到大,设定reverse = False 可以从大到小
sorted(list,reverse=False)
Out[88]: [1, 2, 4, 5, 7]

sorted(list,reverse=True)
Out[89]: [7, 5, 4, 2, 1]

2、根据自定义规则来排序,使用参数:key

# 使用key,默认搭配lambda函数使用
sorted(chars,key=lambda x:len(x))
Out[92]: ['a', 'is', 'boy', 'bruce', 'handsome']

sorted(chars,key=lambda x:len(x),reverse= True)
Out[93]: ['handsome', 'bruce', 'boy', 'is', 'a']

3、根据自定义规则来排序,对元组构成的列表进行排序

tuple_list = [('A', 1,5), ('B', 3,2), ('C', 2,6)]
#key=lambda x: x[1]中可以任意选定x中可选的位置进行排序
sorted(tuple_list, key=lambda x: x[1]) 

Out[94]: [('A', 1, 5), ('C', 2, 6), ('B', 3, 2)]

sorted(tuple_list, key=lambda x: x[0])
Out[95]: [('A', 1, 5), ('B', 3, 2), ('C', 2, 6)]

sorted(tuple_list, key=lambda x: x[2])
Out[96]: [('B', 3, 2), ('A', 1, 5), ('C', 2, 6)]

4、排序的元素是自定义类

class tuple_list:
 def __init__(self, one, two, three):
  self.one = one
  self.two = two
  self.three = three
 def __repr__(self):
  return repr((self.one, self.two, self.three))


tuple_list_ = [tuple_list('A', 1,5), tuple_list('B', 3,2), tuple_list('C', 2,6)]

sorted(tuple_list_, key=lambda x: x.one)
Out[104]: [('A', 1, 5), ('B', 3, 2), ('C', 2, 6)]

sorted(tuple_list_, key=lambda x: x.two)
Out[105]: [('A', 1, 5), ('C', 2, 6), ('B', 3, 2)]

sorted(tuple_list_, key=lambda x: x.three)
Out[106]: [('B', 3, 2), ('A', 1, 5), ('C', 2, 6)]

5、sorted 也可以根据多个字段来排序

class tuple_list:
 def __init__(self, one, two, three):
  self.one = one
  self.two = two
  self.three = three
 def __repr__(self):
  return repr((self.one, self.two, self.three))

tuple_list_ = [tuple_list('C', 1,5), tuple_list('A', 3,2), tuple_list('C', 2,6)]
# 首先根据one的位置来排序,然后根据two的位置来排序
sorted(tuple_list_, key=lambda x:(x.one, x.two))
Out[112]: [('A', 3, 2), ('C', 1, 5), ('C', 2, 6)]

6、使用operator 中的itemgetter方法和attrgetter方法

tuple_list = [('A', 1,5), ('B', 3,2), ('C', 2,6)]

class tuple_list_class:
 def __init__(self, one, two, three):
  self.one = one
  self.two = two
  self.three = three
 def __repr__(self):
  return repr((self.one, self.two, self.three))

tuple_list_ = [tuple_list_class('C', 1,5), tuple_list_class('A', 3,2), tuple_list_class('C', 2,6)]

from operator import itemgetter
sorted(tuple_list, key=itemgetter(1))

Out[119]: [('A', 1, 5), ('C', 2, 6), ('B', 3, 2)]

from operator import attrgetter
sorted(tuple_list_, key=attrgetter('one')) # attrgetter 传入的参数必须是str

Out[120]: [('A', 3, 2), ('C', 1, 5), ('C', 2, 6)]

# 如果是根据多个类的参数排序,按照参数定义顺序
from operator import attrgetter
sorted(tuple_list_, key=attrgetter('two','one'))

Out[121]: [('C', 1, 5), ('C', 2, 6), ('A', 3, 2)]

高级用法

有时候,我们要处理的数据内的元素不是一维的,而是二维的甚至是多维的,那要怎么进行排序呢?这时候,sorted()函数内的key参数就派上用场了!从帮助信息上可以了解到,key参数可传入一个自定义函数。那么,该如何使用呢?让我们看看如下代码:

>>>l=[('a', 1), ('b', 2), ('c', 6), ('d', 4), ('e', 3)]
>>>sorted(l, key=lambda x:x[0])
Out[39]: [('a', 1), ('b', 2), ('c', 6), ('d', 4), ('e', 3)]
>>>sorted(l, key=lambda x:x[0], reverse=True)
Out[40]: [('e', 3), ('d', 4), ('c', 6), ('b', 2), ('a', 1)]
>>>sorted(l, key=lambda x:x[1])
Out[41]: [('a', 1), ('b', 2), ('e', 3), ('d', 4), ('c', 6)]
>>>sorted(l, key=lambda x:x[1], reverse=True)
Out[42]: [('c', 6), ('d', 4), ('e', 3), ('b', 2), ('a', 1)]

这里,列表里面的每一个元素都为二维元组,key参数传入了一个lambda函数表达式,其x就代表列表里的每一个元素,然后分别利用索引返回元素内的第一个和第二个元素,这就代表了sorted()函数利用哪一个元素进行排列。而reverse参数就如同上面讲的一样,起到逆排的作用。默认情况下,reverse参数为False。
当然,正如一开始讲到的那样,如果想要对列表直接进行排序操作,可以用成员方法sort()来做:

>>>l.sort(key=lambda x : x[1])
>>>l
Out[45]: [('a', 1), ('b', 2), ('e', 3), ('d', 4), ('c', 6)]
>>>l.sort(key=lambda x : x[1], reverse=True)
>>>l
Out[47]: [('c', 6), ('d', 4), ('e', 3), ('b', 2), ('a', 1)]

对于三维及以上的数据排排序,上述方法同样适用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
python socket多线程通讯实例分析(聊天室)
Apr 06 Python
浅谈Python的文件类型
May 30 Python
Python查找两个有序列表中位数的方法【基于归并算法】
Apr 20 Python
django 解决manage.py migrate无效的问题
May 27 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
Jun 05 Python
python中cPickle类使用方法详解
Aug 27 Python
python实现定时发送qq消息
Jan 18 Python
Python 之 Json序列化嵌套类方式
Feb 27 Python
python对execl 处理操作代码
Jun 22 Python
在django中查询获取数据,get, filter,all(),values()操作
Aug 09 Python
python如何正确使用yield
May 21 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 Python
python 2.7.13 安装配置方法图文教程
Sep 18 #Python
Python DataFrame.groupby()聚合函数,分组级运算
Sep 18 #Python
python 3.6.2 安装配置方法图文教程
Sep 18 #Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 #Python
python 3.6.4 安装配置方法图文教程
Sep 18 #Python
python 3.6.5 安装配置方法图文教程
Sep 18 #Python
python的pip安装以及使用教程
Sep 18 #Python
You might like
php实现网站插件机制的方法
2009/11/10 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
php实现文章评论系统
2019/02/18 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
javascript ie6兼容position:fixed实现思路
2013/04/01 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
Bootstrap轮播插件简单使用方法介绍
2016/06/21 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
vue高德地图之玩转周边
2017/06/16 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
vuejs实现标签选项卡动态更改css样式的方法
2018/05/31 Javascript
详解vue更改头像功能实现
2019/04/28 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
基于python的字节编译详解
2017/09/20 Python
如何定义TensorFlow输入节点
2020/01/23 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
python selenium xpath定位操作
2020/09/01 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
元旦联欢会感言
2014/03/04 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
2015最新民情日记范文
2015/06/26 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android
豆瓣2021评分最高动画剧集-豆瓣评分最高的动画剧集2021
2022/03/18 日漫
使用CSS实现黑白格背景效果
2022/06/01 HTML / CSS