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的Twisted框架中使用Deferred对象来管理回调函数
May 25 Python
Python内置数据结构与操作符的练习题集锦
Jul 01 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
一个Python最简单的接口自动化框架
Jan 02 Python
Python 做曲线拟合和求积分的方法
Dec 29 Python
Python3 批量扫描端口的例子
Jul 25 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 Python
基于python实现微信好友数据分析(简单)
Feb 16 Python
Python作用域与名字空间原理详解
Mar 21 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
Jul 18 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 Python
Django基础CBV装饰器和中间件
Mar 22 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
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
php继承中方法重载(覆盖)的应用场合
2015/02/09 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
List the Stored Procedures in a SQL Server database
2007/06/20 Javascript
javascript 二分法(数组array)
2010/04/24 Javascript
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
用Javascript评估用户输入密码的强度(Knockout版)
2011/11/30 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
谈谈JS中的!!
2017/12/07 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
2020/04/11 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
Python中@property的理解和使用示例
2019/06/11 Python
python取余运算符知识点详解
2019/06/27 Python
简单了解python关系(比较)运算符
2019/07/08 Python
django-初始配置(纯手写)详解
2019/07/30 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
澳洲小众品牌的集合网站:BNKR
2018/02/23 全球购物
NFL加拿大官方网上商店:NHLShop.ca
2019/03/12 全球购物
介绍一下linux的文件权限
2014/07/20 面试题
英语简历自我评价
2014/01/26 职场文书
学校政风行风整改方案
2014/10/25 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
学生早退检讨书(范文)
2019/08/19 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python
Redis主从复制操作和配置详情
2022/09/23 Redis