python中的排序方法都有哪些_Python中的排序方法sort(),sorted(),argsort()等

Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列。

1)排序基础

简单的升序排序是非常容易的。只需要调用sorted()方法。它返回一个新的list,新的list的元素基于小于运算符(__lt__)来排序。

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

[1, 2, 3, 4, 5]

你也可以使用list.sort()方法来排序,此时list本身将被修改。通常此方法不如sorted()方便,但是如果你不需要保留原来的list,此方法将更有效。

>>> a = [5, 2, 3, 1, 4]

>>> a.sort()

>>> a

[1, 2, 3, 4, 5]

另一个不同就是list.sort()方法仅被定义在list中,相反地sorted()方法对所有的可迭代序列都有效。

>>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})

[1, 2, 3, 4, 5]

2)key参数/函数

从python2.4开始,list.sort()和sorted()函数增加了key参数来指定一个函数,此函数将在每个元素比较前被调用。 例如通过key指定的函数来忽略字符串的大小写:

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

['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

key参数的值为一个函数,此函数只有一个参数且返回一个值用来进行比较。这个技术是快速的因为key指定的函数将准确地对每个元素调用。

更广泛的使用情况是用复杂对象的某些值来对复杂对象的序列排序,例如:

copycode.gif

>>> student_tuples = [

('john', 'A', 15),

('jane', 'B', 12),

('dave', 'B', 10),

]

>>> sorted(student_tuples, key=lambda student: student[2]) # sort by age

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

copycode.gif

同样的技术对拥有命名属性的复杂对象也适用,例如:

>>> 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) # sort by age

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

3)Operator 模块函数

上面的key参数的使用非常广泛,因此python提供了一些方便的函数来使得访问方法更加容易和快速。operator模块有itemgetter,attrgetter,从2.6开始还增加了methodcaller方法。使用这些方法,上面的操作将变得更加简洁和快速:

>>> 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模块还允许多级的排序,例如,先以grade,然后再以age来排序:

>>> 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)]

4)升序和降序

list.sort()和sorted()都接受一个参数reverse(True or False)来表示升序或降序排序。例如对上面的student降序排序如下:

>>> 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)]

5)排序的稳定性和复杂排序

从python2.2开始,排序被保证为稳定的。意思是说多个元素如果有相同的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升序排列。

>>> s = sorted(student_objects, key=attrgetter('age')) #sort on secondary key

>>> sorted(s, key=attrgetter('grade'), reverse=True) #now sort on primary key, descending

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

6)numpy中数组矩阵的排序方法argsort()

argsort(a, axis=-1, kind='quicksort', order=None)

Returns the indices that would sort an array.

从中可以看出argsort函数返回的是数组值从小到大的索引值

Examples

--------

One dimensional array:一维数组

>>> x = np.array([3, 1, 2])>>>np.argsort(x)

array([1, 2, 0])

Two-dimensional array:二维数组

>>> x = np.array([[0, 3], [2, 2]])>>>x

array([[0,3],

[2, 2]])>>> np.argsort(x, axis=0) #按列排序

array([[0, 1],

[1, 0]])>>> np.argsort(x, axis=1) #按行排序

array([[0, 1],

[0,1]])

例1:

>>> x = np.array([3, 1, 2])>>> np.argsort(x) #按升序排列

array([1, 2, 0])>>> np.argsort(-x) #按降序排列

array([0, 2, 1])>>> x[np.argsort(x)] #通过索引值排序后的数组

array([1, 2, 3])>>> x[np.argsort(-x)]

array([3, 2, 1])

另一种方式实现按降序排序:

>>> a =x[np.argsort(x)]>>>a

array([1, 2, 3])>>> a[::-1]

array([3, 2, 1])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javadoc maven_Maven Fluido Skin和Javadoc类图

javadoc maven我使用Maven网站已有一段时间了,对此我感到非常满意。 我不想在Maven 3之后更新我的项目,但是没关系,Maven 3带来了许多新奇的东西。 但是,有两件事使我感到烦恼:缺乏美观和现代的外观,以及浏…

Python的包管理工具

刚开始学习Python时,在看文档和别人的blog介绍安装包有的用easy_install, setuptools, 有的使用pip,distribute,那麽这几个工具有什么关系呢,看一下下面这个图就明白了 下面简单的介绍一下: Distribute是对标准库disu…

2018软工实践第六次作业-团队选题报告

组长博客地址:点击这里 选题报告内容 选题报告下载链接:点击下载本组评审表设计 评审表下载链接:点击下载评审表预览:NABCD 分析引用 NEED 需求 用户群体 主要针对人群:福州大学的广大师生群体以及食堂各个店铺用户数量…

关于vs2008上的socket链接错误问题

昨天想用socket做一个简单的windows程序, 先拿来了以前在vc6.0上做的一小段代码, 竟然发现在vs2008上不能运行.出现了好多链接错误, 研究了好半天也没有发现是怎么回事.>下来是代码和 错误信息. 正在链接...>1>tem.obj : error LNK2019: 无法解析的外部符号 __imp__cl…

python定义变量并赋值_Python动态声明变量赋值代码实例

这篇文章主要介绍了Python动态声明变量赋值代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过exec()、globals()和locals() # 通过exec() for i in range(1, 4): # 第一次循环 i1 时,会执行字符串中的…

应用JDK 9 @不推荐使用的增强功能

我在博客文章JDK 9 Deprecated Annotation Enhancements中讨论了针对Deprecated注释的当前建议的JDK 9增强 功能 。 在本文中,我将更详细地介绍这些次要增强功能的建议用法,并说明关键的Java SE API如何已经应用了这些Deprecated增强功能。 JEP 277主页…

win7下安装pip——Python的包管理工具

很多Python的工具包的安装,用一个pip install ** 就可以了,看得我这个晕啊。。。于是搞了好几个小时,终于明白了pip 和easy_install、distribute 一样,是安装Python工具包的便捷管理工具。这几个管理工具的关系在:http…

MySQL中left join、right join与inner join的区别

1、数据库 1.1、作者表 1.2、图书表 1.3、出版社表 2、left join left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录。 2.1、sql语句 select * from app01_publisher left join app01_book on app01_publisher.id app01_book.publish_id 2.2、查询结果 3…

python得读音_python3 - 文本读音器

本篇分享的是使用python3制作一个文本读音器,简单点就是把指定的文本文字转语音说出来;做这么个小工具主要是为了方便自己在平时看一些文章眼累的时候,可通过语音来帮助自己,当然如果你是小说迷,可以扩展成一个小说读音…

Linux下python升级步骤

首先下载源tar包 可利用linux自带下载工具wget下载,如下所示: 1 # wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz 或自己去网上找,这里提供一个最新版的下载链接:http://xiazai.zol.com.cn/detail/33/320958.sht…

windows 下安装Simplejson方法

1.下载:http://pypi.python.org/pypi/simplejson/ 文件为压缩文件 2.解压:可以直接右键:解压文件.例如:D:/simplejson 3.开始---运行---输入命令:cmd 4.进入到目录(如:D:/simplejson&#xff09…

Vue(二十八)el-cascader 动态加载 - 省市区组件

1.后台接口为点击加载下一级 &#xff0c;传省市区id <template><el-cascaderv-model"selectedOptions"placeholder"请选择省市区":options"cascaderData"active-item-change"handleItemChange":props"{value: id,label…

用虚拟机安装了红帽后,我确实没设置用户名密码,但现在一打开就让输入用户名密码。这种情况该怎么办??

2011-05-05 15:22 提问者采纳破解root密码方法 1、在启动Linux时出现这个界面按e键。 2、按e键后出现选择界面 3、再按e键进入编辑状态。 4、用上、下键选择第二行以”kernel”开头的这一行&#xff0c;然后再按e键进入编辑状态 5、在此行的末尾&#xff0c;按空格键后输入sing…

Mongo数据库搭建

一、安装 1、首先下载Mongo程序&#xff0c;到官方网站上选择适合自己的版本下载&#xff0c;在这里我选择的win32平台下的程序包。解压之后配置相应的环境变量&#xff0c;即可在CMD命令窗口对Mongo进行操作。官方下载URL:http://www.mongodb.org/downloads 在该页面的下方有…

如何制作混合果汁?

天猫超市塞浦路斯Prima牌菠萝果汁汇源葡萄果汁 倒在一起。转载于:https://www.cnblogs.com/theodoric008/p/9792743.html

pl/postgresql_PostgreSQL PL / java简介

pl/postgresql现代数据库允许以多种语言编写存储过程。 一种常见的实现语言是java.NB&#xff0c;本文讨论了PostgreSQL特定的Java实现。 其他数据库的详细信息将有所不同&#xff0c;但概念将相同。 PL / Java的安装 在Ubuntu系统上安装PL / Java很简单。 我将首先创建一个新…

python输出文本和值_python读取文本中数据并转化为DataFrame的实例

在技术问答中看到一个这样的问题&#xff0c;感觉相对比较常见&#xff0c;就单开一篇文章写下来。 从纯文本格式文件 “file_in”中读取数据&#xff0c;格式如下&#xff1a;需要输出成“file_out”&#xff0c;格式如下&#xff1a;数据的原格式是“类别&#xff1a;内容”&…

欧拉回路与欧拉道路

图G的一个回路&#xff0c;若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。如果一个图只是形成一个连通所有节点的链&#xff0c;且每一点只走一次&#xff0c;则成为欧拉道路。具有欧拉回路或欧拉道路的图称为欧拉图&#xff08;简称E图&#xff09;。有向图的欧拉回路…

小心DLL链接静态库时的内存错误

最近写的模块&#xff0c;在独立的应用程序中测试是没问题的&#xff0c;但把它装配成DLL后&#xff0c;再在另一个应用程序中调用时却出现了内存错误。程序的模块链接关系大概是这样的&#xff1a; module就是我所写的模块&#xff0c;在这里被封装为DLL&#xff0c;因为要使用…

阿里试用,女朋友逼着我给她排序

阿里试用排序 抱歉&#xff0c;之前莫名其妙把配置文件给 ignore 了&#xff0c;已经修复&#xff0c;抱歉 前景提要 说来简直丢尽了钢铁直男的脸&#xff0c;没错&#xff0c;昨晚我在愉快的做着外包的活&#xff08;中国移动的小程序&#xff0c;自由职业&#xff0c;喂&…