在学习python的过程中,感觉python中的排序相和c++中的泛型算法还是比较相似的,但相对于c++而言更加简单易用。

python中列表的内置函数sort()可以对列表中的元素进行排序,而全局性的sorted()函数则对所有可迭代的序列都是适用的;并且sort()函数是内置函数,会改变当前对象,而sorted()函数只会返回一个排序后的当前对象的副本,而不会改变当前对象。

1、内置函数sort()

原型:sort(fun,key,reverse=False)

参数fun是表明此sort函数是基于何种算法进行排序的,一般默认情况下python中用的是归并排序,并且一般情况下我们是不会重写此参数的,所以基本可以忽略;

参数key用来指定一个函数,此函数在每次元素比较时被调用,此函数代表排序的规则,也就是你按照什么规则对你的序列进行排序;

参数reverse是用来表明是否逆序,默认的False情况下是按照升序的规则进行排序的,当reverse=True时,便会按照降序进行排序。

下面 通过简单的例子进行解说:

(由于个人爱好原因,我的编译器是pycharm,所以接下来的所有示例都是在pycharm中可以运行的。)

#coding:utf-8

from operator import attrgetter,itemgetter

list1 = [(2,'huan',23),(12,'the',14),(23,'liu',90)]

#使用默认参数进行排序,即按照元组中第一个元素进行排序

list1.sort()

print list1

#输出结果为[(2, 'huan', 23), (12, 'the', 14), (23, 'liu', 90)]

#使用匿名表达式重写key所代表的函数,按照元组的第二个元素进行排序

list1.sort(key=lambda x:(x[1]))

print list1

#[(2, 'huan', 23), (23, 'liu', 90), (12, 'the', 14)]

#使用匿名表达式重写key所代表的函数,按照元组的第三个元素进行排序

list1.sort(key=lambda x:(x[2]))

print list1

#[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

#使用匿名函数重写key所代表的函数,先按照元组中下标为2的进行排序,

# 对于下标2处元素相同的,则按下标为0处的元素进行排序

list1.sort(key=lambda x:(x[2],x[0]))

print list1

#[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

#使用operator模块中的itemgetter函数进行重写key所代表的函数,按照下标为1处的元素进行排序

list1.sort(key=itemgetter(1))

print list1

#[(2, 'huan', 23), (23, 'liu', 90), (12, 'the', 14)]

#使用operator模块中的itemgetter函数进行重写key所代表的函数,按照下标为2处的元素进行排序

list1.sort(key=itemgetter(2))

print list1

# [(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

# 此处可以类比lambda中的排序方法,就不再解释

list1.sort(key=itemgetter(2,0))

print list1

#[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

对于上述中的匿名函数大家如果 不了解的可以自己去了解一下,这里我就不展开了。

这里我想解释一下operator这个模块中的两个函数:

(1)itemgetter

operator.itemgetter(item)operator.itemgetter(*items)这个函数会调用所传入的操作数的__getitem__()方法返回一个带有item的可调用对象,如果传入的参数是多个,那么返回带有一个元组类型的可调用对象。例如:f = itemgetter(2), 调用 f(r) 后,将会返回r[2]g = itemgetter(2, 5, 3), 调用 g(r) 后将会返回元组 (r[2],

r[5], r[3]).(2)attrgetteroperator.attrgetter(attr)operator.attrgetter(*attrs)这个函数返回一个带有操作数中的attr属性的可调用对象,如果多个属性被传入,那么返回带有这些属性的元组。这些属性的名字里可以包含包含多个子名字例如:f =

attrgetter('name'), 调用f(b) 将返回b.name.f =

attrgetter('name', 'date'), 调用 f(b) 将返回(b.name,

b.date).f =

attrgetter('name.first', 'name.last'), 调用f(b) 将返回 (b.name.first,

b.name.last).

2、全局函数sorted()

对于sorted()函数中key的重写,和sort()函数中是一样的,所以刚刚对于sort()中讲解的方法,都是适用于sorted()函数中,在下面的解释中我也就不再列举了,并且下面将要讲解的key的重写也同样是适用于sort()函数的,那么为什么不再sort()函数中列举完呢,那是为了不偏不倚,给大家一个客观地理解。

下面仍然从一个例子切入:

from operator import attrgetter

class Data:

article_name = str()

readers = 0

def __init__(self,tpl):

self.article_name = tpl[0]

self.readers = tpl[1]

def getKey(self):

return self.readers

def __str__(self):

return str(str(self.article_name)+str(':')+str(self.readers))

list1 = [Data(("java",100)),Data(("c++",100)),Data(("python",89)),Data(("c++",90))]

#此处调用attrgetter函数使得按照readers进行排序

list2 = sorted(list1,key=attrgetter("readers"))

"""结果为

python:89

c++:90

java:100

c++:100

"""

#此处使得list1先按照article_name进行排序,对于名字相同的再按照readers进行排序

list3 = sorted(list1,key=attrgetter("article_name","readers"))

"""

结果为:

c++:90

c++:100

java:100

python:89

"""

#使用类中的自定义函数也同样可以操作

list4 = sorted(list1,key = Data.getKey)

"""

结果为:

python:89

c++:90

java:100

c++:100

"""上面例子的结果都是通过打印出来的结果。

对于sorted()函数,同样可以使用sort()函数中介绍的方法,大家可以自己进行尝试。

当然最后说一下,在上面所有的例子中我都没有使用到reverse参数,对于这个参数,是用于控制排序的方向的,大家可以自己试试,在这里也就不介绍了。

python中sort函数是什么意思_python中sort和sorted函数相关推荐

  1. python的sort方法是哪种_python中的sort方法使用详解

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可 ...

  2. python的作用域分别有几种_python中作用域与函数嵌套

    知识回顾: 拆解传参. 1.字典传参.使用** 2.列表传参.使用* 实际上我们在定义函数的时候,如果省略了星号,那么在调用函数的时候必须要省略星号,除非我们拆解后的参数个数刚好相等. 视频内容 本节 ...

  3. python可变参数和关键字参数位置_python中函数的默认参数和可变长参数如何排列?...

    参数在python中总是通过赋值进行传递的.在默认情况下,参数是通过其位置进行匹配的,从左到右,而且必须精确的传递和函数头部参数名一样多的参数. 这种默认的传递方式很简单 def f(a,b,c): ...

  4. python里删除range里的数字_python中range函数与列表中删除元素

    一.range函数使用 range(1,5)   代表从1到4(不包含5),结果为:1,2,3,4   ,默认步长为1 range(1,5,2)   结果为:1, 3  (同样不包含5) ,步长为2 ...

  5. python中main的含义及用法_python中main函数的用法

    Python Python开发 Python语言 python中main函数的用法 什么场景下会有main函数? 当该python脚本被作为模块(module)引入(import)时,其中的main( ...

  6. python中函数的可变参数_Python中函数的参数定义和可变参数

    转自:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944416.html 刚学用Python的时候,特别是看一些库的源码时,经常会看到fun ...

  7. python中形参可以使用中文定义嘛_python中函数的参数分类

    详解python函数的参数 一.参数的定义 1.函数的参数在哪里定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号, 隔开 案列: ...

  8. python函数传值还是地址_python中给函数传参是传值还是传引用

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

  9. python的lambda函数错误的是_Python 中的 AWS Lambda 函数错误 - AWS Lambda

    Python 中的 AWS Lambda 函数错误 当您的代码引发错误时,Lambda 将生成错误的 JSON 表示形式.此错误文档会出现在调用日志中,对于同步调用,它出现在输出中. 例 lambda ...

最新文章

  1. 求两个矩形重叠部分的面积
  2. OpenVINO + OpenCV实现车辆检测与道路分割
  3. 福利 | NVIDIA英伟达免费直播课:带你选择、搭建AI服务器!
  4. linux笔记本上安装了双显卡驱动(intel+nvidia)
  5. 【十二省联考2019】异或粽子【01Trie】【堆】【前k大套路】
  6. java applet鼠标点击事件_Swing 鼠标单击事件?
  7. MS SQL数据库备份和恢复存储过程
  8. SQL 数据发现和分类
  9. git命令详解( 六 )
  10. 常用 css html 样式
  11. bzoj 1119 [POI2009] SLO bzoj 1697 牛排序 —— 置换+贪心
  12. Java appium iOS_Appium+iOS环境搭建
  13. [三思笔记]---一步一步学DataGuard
  14. 汽车功能安全标准“ISO 26262”导入实践(上)
  15. 用matlab处理信号,信号处理matlab程序示例
  16. 2022五一数学建模有何思路模型?
  17. php实现五维雷达图,【数据可视化·图表篇】雷达图
  18. 卸载wps后,安装完office 2010 图标异常,类型未识别问题
  19. HELLO WORLD! 但是javac找不到文件?
  20. C语言双引号A单引号A,C语言查漏补缺——单引号和双引号

热门文章

  1. java图形界面美化_Java图形界面设计——substance皮肤
  2. pyqtgraph 官方案例 学习记录 000 序
  3. CSS精简笔记(五)------高级技巧
  4. IT外企面试回答技巧
  5. 西门子EM235模块特性
  6. 哪吒社区 - 风火轮计划
  7. 协同共进 | 中睿天下入会工业信息安全产业发展联盟
  8. Seo搜索引擎排名秘笈
  9. GA-B75M-D3V REV:1.1
  10. 【我大学接触过的知识统计--大数据专业】