python中对数据进行各种排序的方法


Posted in Python onJuly 02, 2019

Python列表具有内置的 list.sort()方法,可以在原地修改列表。 还有一个 sorted()内置的函数从迭代构建一个新的排序列表。在本文中,我们将探讨使用Python排序数据的各种技术。

请注意,sort()原始数据被破坏,sorted()没有对原始数据进行操作,而是新建了一个新数据。

一、基本的排序

最基本的排序很简单。只要使用sorted()函数即可返回一个 新的排序的列表

>>>sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]

咱们也可以使用 list.sort()方法。该方法是对列表list进行的原地操作(原数据被修改,已经不是原来的本来面目)。一般情况下,不如使用 sorted()方便,但是如果你不需要原列表list,使用 sort()会更具效率。

>>>a = [5, 2, 3, 1, 4]
>>>a.sort()
>>>a #a发生改变
[1, 2, 3, 4, 5]

另一个不同点, list.sort()方法只能应用于列表对象数据。而 sorted()却可以对任何可迭代对象进行排序。也就是说sorted()更具有普遍使用性。这里大灯建议初学者使用sorted()。

二、Key参数函数

list.sort()和 sorted()都有key参数,可以指定函数来对元素进行排序。

例如,这里我们使用一个字符串(字符串也是可迭代对象)

>>>sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

我们指定按照首字符(统一变为小写后的字符)进行排序。 key参数的值是一个带有单一参数的函数,返回一个键key用于排序。这种技术运行挺快的,具体为啥,我不懂。

例如:

>>>student_tuples = [
... ('john', 'A', 15),
... ('jane', 'B', 12),
... ('dave', 'B', 10)]
>>>sorted(student_tuples, key = lambda student:student[2]) 
"""

通过key排序。

key的值: lambda函数

lambda函数的参数 是student_tuples列表中的元素-元组

lambda函数运算的是 student_tuples列表元素中元组的第三个元素。

"""
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

同样该方法也可作用于对象的属性。例如这里我先定义一个属性

>>> class Student:
... def __init__(self, name, grade, age):
... self.name = name
... self.grade = grade
... self.age = age
... def __repr__(self):
... return repr((self.name, self.grade, self.age))
>>> student_objects = [
... Student('john', 'A', 15),
... Student('jane', 'B', 12),
... Student('dave', 'B', 10)]
>>> sorted(student_objects, key=lambda student: student.age) 
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

三、Operator库的方法

上面列的那些key函数方法都是非常常见,所以说python提供简洁高效的方法。 operator库有 itemgetter(), attrgetter(), methodcaller()这三个方法。

使用上面提到的operator库的方法,也可以实现上述例子,而且更简单,运行更快。

>>> from operator import itemgetter, attrgetter
>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

operator库的方法可以提供多维度排序。例如我们队成绩和年龄同时排序,但成绩的优先级高于年龄。

>>> sorted(student_tuples, key=itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
>>> sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

四、升序与降序

list.sort()和 sorted()都可以通过reverse参数(True或False)进行升降序调整。这里我们对student数据中 年龄age进行翻转排序规则。

>>> sorted(student_tuples, key=itemgetter(2), reverse=True)
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(student_objects, key=attrgetter('age'), reverse=True)
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

五、排序稳定性和复杂排序

排序要保障稳定,这意味着当多个记录拥有同一个key时,原始的数据中的排序会保留下来。

>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
>>> sorted(data, key=itemgetter(0))
[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]

注意为何两个记录中的blue保留了原始数据的数据,所以按照原始数据顺序,('blue', 1)比('blue', 2)优先。

这个奇妙的特性让咱们可以使用一系列排序步骤来构建复杂的排序方法。例如,对student数据的 成绩grade进行降序,再对 年龄age进行升序排序。实现方法:首先对age排序,再对grade排序。

>>> s = sorted(student_objects, key=attrgetter('age'))
>>> sorted(s, key=attrgetter('grade'), reverse=True) 
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

六、老办法-使用cmp参数

cmp也就是compare,对比比较。在2.x时代,都支持cmp参数方法。

在3.x中,cmp参数被彻底移除。

在2.x中,sort允许一个可选的函数,可以进行比较compare。 该功能应该采取要比较两个参数,然后返回的负值代表小于;返回零,代表相等;正值代表大于。 在3.x中,使用cmp思想,我们可以这样做:

>>> def numeric_compare(x, y):
... return x - y
>>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)
[1, 2, 3, 4, 5]

如果想让排序变为降序,可以使用下面

>>> def reverse_numeric(x, y):
... return y - x
>>> sorted([5, 2, 4, 1, 3], cmp=reverse_numeric)
[5, 4, 3, 2, 1]

总结

以上所述是小编给大家介绍的python中对数据进行各种排序的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python进阶教程之函数参数的多种传递方法
Aug 30 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
python将字典内容存入mysql实例代码
Jan 18 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
Dec 10 Python
PowerBI和Python关于数据分析的对比
Jul 11 Python
python 实现屏幕录制示例
Dec 23 Python
Python识别html主要文本框过程解析
Feb 18 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
Jul 02 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
Jul 14 Python
Jmeter HTTPS接口测试证书导入过程图解
Jul 22 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
python Zmail模块简介与使用示例
Dec 19 Python
Python虚拟环境的原理及使用详解
Jul 02 #Python
python输出电脑上所有的串口名的方法
Jul 02 #Python
如何更优雅地写python代码
Jul 02 #Python
Python pip替换为阿里源的方法步骤
Jul 02 #Python
python set内置函数的具体使用
Jul 02 #Python
ZABBIX3.2使用python脚本实现监控报表的方法
Jul 02 #Python
浅谈python 中类属性共享的问题
Jul 02 #Python
You might like
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
JavaScript中的style.display属性操作
2013/03/27 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
浅谈javascript如何获取文件后缀名
2020/08/07 Javascript
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
python实现批量修改文件名
2020/03/23 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
详解canvas.toDataURL()报错的解决方案全都在这了
2020/03/31 HTML / CSS
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
3个CCIE对一个工程师的面试题
2012/05/06 面试题
师范毕业生求职自荐信
2013/09/25 职场文书
纪律教育学习月活动总结
2014/08/27 职场文书
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android
动漫APP软件排行榜前十名,半次元上榜,第一款由腾讯公司推出
2022/03/18 杂记
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
2022/04/13 Java/Android