python中sorted的用法append_python sorted()排序详解

排序,在编程中经常遇到的算法,我也在几篇文章中介绍了一些关于排序的算法。有的高级语言内置了一些排序函数。本文讲述Python在这方面的工作。供使用

内置函数sorted()/list.sort()的使用

简单应用

python对list有一个内置函数:

>>> a=[5,3,6,1,9,2]

>>>

1

2

3

4

5

6

>>>a=[5,3,6,1,9,2]

>>>sorted(a)#a经过sorted之后,得到一个排序结果

[1,2,3,5,6,9]#但是,原有的a并没有受到影响

>>>a

[5,3,6,1,9,2]

也可以使用list.sort()来进行上述操作。

>>> a.sort()

>>> a #注意这里,经过list.sort()之后,原有

[1, 2, 3, 5, 6, 9] #a的顺序已经发生变化,与上述不同之处。

1

2

3

4

>>>a.sort()

>>>a#注意这里,经过list.sort()之后,原有

[1,2,3,5,6,9]#a的顺序已经发生变化,与上述不同之处。

sorted和list.sort()的区别:list.sort()只能对list类型进行排序。如下:

>>> b_dict={1:'e',3:'m',9:'a',5:'e'}

>>> b_dict.sort()

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'dict' object has no attribute 'sort'

1

2

3

4

5

6

>>>b_dict={1:'e',3:'m',9:'a',5:'e'}

>>>b_dict.sort()

Traceback(mostrecentcalllast):

File"",line1,in

AttributeError:'dict'objecthasnoattribute'sort'

而sorted则不然,看例子:

>>> b_dict

{1: 'e', 3: 'm', 5: 'e', 9: 'a'}

>>> sorted(b_dict)

[1, 3, 5, 9]

1

2

3

4

5

>>>b_dict

{1:'e',3:'m',5:'e',9:'a'}

>>>sorted(b_dict)

[1,3,5,9]

sorted之后,上述对dictinoary中,将key值取出并排序,返回list类型的排序结果。

按照指定关键词排序

在list.sort()和sorted中,都可以根据指定的key值排序。例如:

sorted的例子:

>>> qw="I am Qiwsir you can read my articles im my blog".split()

>>> qw

['I', 'am', 'Qiwsir', 'you', 'can', 'read', 'my', 'articles', 'im', 'my', 'blog']

>>> sorted(qw,key=str.lower) #按照字母升序排列

['am', 'articles', 'blog', 'can', 'I', 'im', 'my', 'my', 'Qiwsir', 'read', 'you']

1

2

3

4

5

6

>>>qw="I am Qiwsir you can read my articles im my blog".split()

>>>qw

['I','am','Qiwsir','you','can','read','my','articles','im','my','blog']

>>>sorted(qw,key=str.lower)#按照字母升序排列

['am','articles','blog','can','I','im','my','my','Qiwsir','read','you']

list.sort()的例子:

>>> qw

['I', 'am', 'Qiwsir', 'you', 'can', 'read', 'my', 'articles', 'im', 'my', 'blog']

>>> qw.sort(key=str.lower)

>>> qw

['am', 'articles', 'blog', 'can', 'I', 'im', 'my', 'my', 'Qiwsir', 'read', 'you']

1

2

3

4

5

6

>>>qw

['I','am','Qiwsir','you','can','read','my','articles','im','my','blog']

>>>qw.sort(key=str.lower)

>>>qw

['am','articles','blog','can','I','im','my','my','Qiwsir','read','you']

此外,key还可以接收函数的单一返回值,按照该值排序。例如:

>>> name_mark_age = [('zhangsan','A',15),('LISI','B',14),('WANGWU','A',16)]

>>> sorted(name_mark_age, key = lambda x: x[2]) #根据年龄排序

[('LISI', 'B', 14), ('zhangsan', 'A', 15), ('WANGWU', 'A', 16)]

>>> sorted(name_mark_age, key = lambda x: x[1]) #根据等级排序

[('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('LISI', 'B', 14)]

>>> sorted(name_mark_age, key = lambda x: x[0]) #根据姓名排序

[('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhangsan', 'A', 15)]

1

2

3

4

5

6

7

8

9

10

>>>name_mark_age=[('zhangsan','A',15),('LISI','B',14),('WANGWU','A',16)]

>>>sorted(name_mark_age,key=lambdax:x[2])#根据年龄排序

[('LISI','B',14),('zhangsan','A',15),('WANGWU','A',16)]

>>>sorted(name_mark_age,key=lambdax:x[1])#根据等级排序

[('zhangsan','A',15),('WANGWU','A',16),('LISI','B',14)]

>>>sorted(name_mark_age,key=lambdax:x[0])#根据姓名排序

[('LISI','B',14),('WANGWU','A',16),('zhangsan','A',15)]

除了上述方式,python中还提供了一个选择循环选择指定元组值的模块

>>> from operator import itemgetter #官方文档:https://docs.python.org/2/library/operator.html#module-operator

>>> name_mark_age.append(('zhaoliu','B',16))

>>> name_mark_age

[('zhangsan', 'A', 15), ('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)]

>>> sorted(name_mark_age,key=itemgetter(2)) #按照年龄排序

[('LISI', 'B', 14), ('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)]

>>> sorted(name_mark_age,key=itemgetter(1,2)) #先按照等级排序,相同等级看年龄

[('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('LISI', 'B', 14), ('zhaoliu', 'B', 16)]

1

2

3

4

5

6

7

8

9

10

11

>>>fromoperatorimportitemgetter#官方文档:https://docs.python.org/2/library/operator.html#module-operator

>>>name_mark_age.append(('zhaoliu','B',16))

>>>name_mark_age

[('zhangsan','A',15),('LISI','B',14),('WANGWU','A',16),('zhaoliu','B',16)]

>>>sorted(name_mark_age,key=itemgetter(2))#按照年龄排序

[('LISI','B',14),('zhangsan','A',15),('WANGWU','A',16),('zhaoliu','B',16)]

>>>sorted(name_mark_age,key=itemgetter(1,2))#先按照等级排序,相同等级看年龄

[('zhangsan','A',15),('WANGWU','A',16),('LISI','B',14),('zhaoliu','B',16)]

在官方文档上,有这样一个例子,和上面的操作是完全一样的。

>>> 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), #注意这里,用class Student来生成列表内的值

Student('jane', 'B', 12), #因此,可以通过student_objects[i].age来访问某个名称的年龄,i=0,则是john的年龄

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

]

>>> sorted(student_objects, key=lambda student: student.age)

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

>>>classStudent:

def__init__(self,name,grade,age):

self.name=name

self.grade=grade

self.age=age

def__repr__(self):

returnrepr((self.name,self.grade,self.age))

>>>student_objects=[

Student('john','A',15),#注意这里,用class Student来生成列表内的值

Student('jane','B',12),#因此,可以通过student_objects[i].age来访问某个名称的年龄,i=0,则是john的年龄

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

]

>>>sorted(student_objects,key=lambdastudent:student.age)

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

也可以引用operator模块来实现上述排序

>>>from operator import attrgetter

>>> sorted(student_objects, key=attrgetter('age'))

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

>>> sorted(student_objects, key=attrgetter('grade', 'age'))

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

1

2

3

4

5

6

>>>fromoperatorimportattrgetter

>>>sorted(student_objects,key=attrgetter('age'))

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

>>>sorted(student_objects,key=attrgetter('grade','age'))

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

总结:sorted的能力超强,不仅实现排序,还能按照指定关键词排序。

以上例子都是升序,如果,增加reverse=True。例如:

>>>from operator import itemgetter

>>> name_mark_age

[('zhangsan', 'A', 15), ('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)]

>>> sorted(name_mark_age, key=itemgetter(2),reverse=True)

[('WANGWU', 'A', 16), ('zhaoliu', 'B', 16), ('zhangsan', 'A', 15), ('LISI', 'B', 14)]

1

2

3

4

5

6

>>>fromoperatorimportitemgetter

>>>name_mark_age

[('zhangsan','A',15),('LISI','B',14),('WANGWU','A',16),('zhaoliu','B',16)]

>>>sorted(name_mark_age,key=itemgetter(2),reverse=True)

[('WANGWU','A',16),('zhaoliu','B',16),('zhangsan','A',15),('LISI','B',14)]

2018-05-29-012523.png

2020012309512985.png

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

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

相关文章

云上的播放框架变得简单:Openshift模块

仅仅几年前,找到一个负担得起的Java Web应用程序托管解决方案是一项艰巨的任务,而寻找免费的托管解决方案是一项不可能的任务。 更不用说甚至考虑自动缩放,单命令部署,持续集成等事情,这都是科幻小说。 去年见证了云计…

C#中的yield return与Unity中的Coroutine(协程)(下)

Unity中的Coroutine(协程) 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件, Image: 将以下代码绑定到Image 1 using UnityEngine;2 using System.Collections;3 using System.Threading;4 using …

【CSS3动画】transform对文字及图片的旋转、缩放、倾斜和移动

前言:之前我有写过CSS3的transform这一这特性,对于它的用法,还不是很透彻,今天补充补充,呵呵 你懂的,小司机准备开车了。 a)再提一提transform的四个属性 ①旋转--->rotate(参数a),单位deg&a…

数据库行转列在现实需求中的用法

select t.客户姓名,sum(case when t.收款类型首款 then t.金额 else 0 end as 首款),sum(case when t.收款类型尾款 then t.金额 else 0 end as 尾款) from table t group by t.客户姓名 这段sql的意思 是 查询出所有客户收款信息 然后按客户分组 分组后 然后将这个客户的所…

apk反编译方式

一、Apk反编译得到Java源代码 下载上述反编译工具包,打开apk2java目录下的dex2jar-0.0.9.9文件夹,内含apk反编译成java源码工具,以及源码查看工具。 apk反编译工具dex2jar,是将apk中的classes.dex转化成jar文件 源码查看工具jdgui…

ADF声明性组件示例

在我以前的文章中,我答应展示如何为智能值列表创建ADF声明性组件。 因此,我将创建一个包含三个元素的组件:标签,输入文本和值的组合框列表。 那很容易。 我在工作空间中创建了一个单独的ADF ViewController项目: 在此项…

Solr集群更新配置的方式

solr集群中配置文件是经常更新的,频率最高的也就是schema.xml和solrconfig.xml这两个配置文件了,对于更新配置文件之前,我们先了解一下集群项目结构 由于在集群模式下,solrconfig.xml和schema.xml等配置文件都由Zookeeper集群管理…

java文本框双击可编辑_java swing 文本域双击变为可编辑

java swing如何实现文本域双击变为可编辑呢?给文本域添加鼠标事件监听程序即可:resultTA1new AssistPopupTextArea();resultTA1.setEditable(false);resultTA1.setLineWrap(true);resultTA1.setWrapStyleWord(true);resultTA1.addMouseListener(new MouseAdapter() {Overridep…

OSGi简介–模块化Java

OSGi联盟是这一搁浅的管理机构,它始于1999年。其最初目标是为网络设备创建开放搁浅。 基于此思想,此规范也针对Java引入。 Eclipse在Java中是第一个。 他们于2004年6月推出了基于OSGi的Eclipse IDE。 OSGi是在Java中定义动态模块的方法。 主要为Java实现…

HDU FatMouse's Speed 基本DP

题意:要求找到的体重递增,速度递减的老鼠,并且输出最长的长度数,而且输出各自的序列数。Special Judge 思路:先按体重由小到大排序,再找最长速度递减序列。 转移方程:mou[i].w>mou[j].w&am…

java xmpp openfire_搭建Xmpp服务器Openfire

step1、 安装java环境这里是检测是否安装java的网页如没有安装则进行以下步骤1、下载jdk7的mac版:jdk-7u79-macosx-x64.dmg2、安装好之后,在命令行进入以下路径查看#cd /Library/Java/JavaVirtualMachines/3、再查看你自己安装的版本#ls版本为jdk-8u171-…

Spark程序运行报错解决(1)

报错内容:System memory 259522560 must be at least 4.718592E8. Please use a larger heap size. 解决:Window——Preference——Java——Installed JREs——选中一个Jre 后 Edit 在Default VM arguments 里加入:-Xmx512M 转载于:https://w…

java setsolinger_java socket 的参数选项解读(转)

在MulticastSocket的源代码里有设置多播的方法:public void setInterface(InetAddress inf) throwsSocketException {if(isClosed()) {throw new SocketException("Socket is closed");}checkAddress(inf, "setInterface");synchronized(infLoc…

【转】Linux终端下 dstat 监控工具

转自https://linux.cn/article-3215-1.html dstat 是一个可以取代vmstat,iostat,netstat和ifstat这些命令的多功能产品。dstat克服了这些命令的局限并增加了一些另外的功能,增加了监控项,也变得更灵活了。dstat可以很方便监控系统…

java jdbc连接db2数据库_Java连接db2数据库(常用数据库连接五)

1.安装好db2数据库,并建立表如下:2.eclipse或myeclipse中建立工程并导入java连接db2所需要的jar包db2java.jar 下载地址:http://download.csdn.net/detail/whzhaochao/64149813.建立iConn接口,代码如下:package com.zh…

Oracle通过邀请Weaver和Chin推动JavaFX向前发展

我昨天发布了愚人节帖子,内容涉及加入NASA协助探索红色大行星。 那个帖子与事实相距不远... NASA开发的技术的所有细节都是100%准确的。 哎呀,即使我辞职也是事实! 唯一不正确的部分是我将加入的公司。 在NASA协助探索火星的工作也…

WinForm------TextEdit只能输入数字

代码: this.textEdit1.Properties.Mask.EditMask "\d"; this.textEdit1.Properties.Mask.MaskType MaskType.RegEx; 转载于:https://www.cnblogs.com/tianhengblogs/p/6093634.html

JavaFX:创建Sprite动画

到目前为止,尽管我的大多数文章都涉及JavaFX属性和绑定,但今天我想写一讲我也致力于JavaFX运行时的另一部分:动画API。 在本文中,我将解释如何在JavaFX中编写自定义动画,以及如何使用这种方法为Sprite动画创建类。 &am…

使用UIBinder的GWT自定义按钮

这是一个有关如何在GWT上使用UIBinder创建自定义按钮的示例。 public class GwtUIBinderButton implements EntryPoint {public void onModuleLoad() {Button button new Button();button.setText("Button");button.addClickHandler(new ClickHandler(){Overridepub…

delete postman 传参_PostMan 传参boolean 类型,接口接受的值一直是false

情形:最近写前台页面的一个按钮,功能是:点击后切换状态,显示是或否。字段名称是isTest,类型是boolean 。写完接口,拿postMan测试,传参如下:但是后台接口接受的数据 一直是false,处理&#xff1a…