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 isinstance函数介绍
Apr 14 Python
举例讲解Python中metaclass元类的创建与使用
Jun 30 Python
Python操作SQLite数据库的方法详解
Jun 16 Python
django 发送邮件和缓存的实现代码
Jul 18 Python
解决Python3.5+OpenCV3.2读取图像的问题
Dec 05 Python
numpy.linspace函数具体使用详解
May 27 Python
python获取当前文件路径以及父文件路径的方法
Jul 10 Python
python2与python3爬虫中get与post对比解析
Sep 18 Python
python zip()函数使用方法解析
Oct 31 Python
Python基础之列表常见操作经典实例详解
Feb 26 Python
python读取图像矩阵文件并转换为向量实例
Jun 18 Python
Python -m参数原理及使用方法解析
Aug 21 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 IF ELSE简化/三元一次式的使用
2011/08/22 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
滚动经典最新话题[prototype框架]下编写
2006/10/03 Javascript
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
2015/03/19 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
javascript实现右下角广告框效果
2017/02/01 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
2017/06/06 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
2018/12/06 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
Python实现的数据结构与算法之双端队列详解
2015/04/22 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
利用python在excel中画图的实现方法
2020/03/17 Python
python在一个范围内取随机数的简单实例
2020/08/16 Python
css3实现3D文本悬停改变效果的示例代码
2019/01/16 HTML / CSS
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
html5实现滑块功能之type="range"属性
2020/02/18 HTML / CSS
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
求职自荐书范文
2013/12/04 职场文书
八一慰问活动方案
2014/02/07 职场文书
小学班级口号大全
2015/12/25 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
iPhone13再次曝光
2021/04/15 数码科技