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之从if开始语句的征程
Sep 14 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
Jun 26 Python
Python利用matplotlib生成图片背景及图例透明的效果
Apr 27 Python
Python实现的径向基(RBF)神经网络示例
Feb 06 Python
python创建文件备份的脚本
Sep 11 Python
Python XlsxWriter模块Chart类用法实例分析
Mar 11 Python
python将print输出的信息保留到日志文件中
Sep 27 Python
使用Python第三方库pygame写个贪吃蛇小游戏
Mar 06 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
Jun 10 Python
python实现定时发送邮件
Dec 23 Python
Python基于爬虫实现全网搜索并下载音乐
Feb 14 Python
python基础之函数的定义和调用
Oct 24 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/10/22 PHP
php下把数组保存为文件格式的实例应用
2010/02/08 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
前台js调用后台方法示例
2013/12/02 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
利用jquery制作滚动到指定位置触发动画
2016/03/26 Javascript
关于微信上网页图片点击全屏放大效果
2016/12/19 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
2018/08/25 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
js实现黑白div块画空心的图形
2018/12/13 Javascript
Vue在 Nuxt.js 中重定向 404 页面的方法
2019/04/23 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
2015/05/20 Python
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
Python3一行代码实现图片文字识别的示例
2018/01/15 Python
python控制nao机器人身体动作实例详解
2019/04/29 Python
Python 实现交换矩阵的行示例
2019/06/26 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
python程序文件扩展名知识点详解
2020/02/27 Python
python多维数组分位数的求取方式
2020/03/03 Python
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
工作睡觉检讨书
2014/02/25 职场文书
中餐厅经理岗位职责
2014/04/11 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
初三学习计划书范文
2014/04/30 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
学校端午节活动总结
2015/02/11 职场文书
英文慰问信范文
2015/03/24 职场文书
浅谈JS的二进制家族
2021/05/09 Javascript