深入理解python中sort()与sorted()的区别


Posted in Python onAugust 29, 2018

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

一,最简单的排序

1.使用sort排序

my_list = [3, 5, 1, 4, 2]
my_list.sort()
print (my_list)
#输出: [1, 2, 3, 4, 5]

使用sort()方法对list排序会修改list本身,不会返回新list.

sort()不能对dict字典进行排序

2.使用sorted()排序

my_list = [3, 5, 1, 4, 2]
result = sorted(my_list)
print (result)
#输出: [1, 2, 3, 4, 5]

my_dict = {"a":"1", "c":"3", "b":"2"}
result = sorted(my_dict)
print (result)
#输出: ['a', 'b', 'c']

sorted()会生成一个新的列表或字典对象,对dict排序默认会按照dict的key值进行排序,最后返回的结果是一个对key值排序好的list

二,key参数

从python2.4开始,list.sort()和sorted()函数增加了key参数来指定一个函数,此函数将在每个元素比较前被调用

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

1.对复杂的元组排序

student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]
result = sorted(student_tuples, key=lambda student: student[2])
print (result)
#输出 [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

以上可以看出排序是按照10, 12, 15值进行排序的,因为函数lambda student:student[2]返回的值分别是10, 12, 15。

所以就用函数返回的值进行比较;key=15 ,key=12,key=10根据这些返回值进行比较;

lambda student:student[2] 等价于
def f(student):
  return student[2]

2.根据字典的value排序

默认sorted是对dict的key排序的,如果要根据dict的value排序就需要指定key参数了

my_dict = {"a":"2", "c":"5", "b":"1"}
result = sorted(my_dict)
print (result)
#默认对dict排序,不指定key参数,会默认对dict的key值进行比较排序
#result输出: ['a', 'b', 'c']
result2 = sorted(my_dict, key=lambda x:my_dict[x])
print (result2)
#指定key参数,根据dict的value排序
#result2输出:['b', 'a', 'c']

扩展用法:

1.Key Function:

从Python2.4开始,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。其执行效率很高,因为对于输入记录key function能够准确的被调用。

对于复杂的对象,使用对象的下标作为key。

例如:

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

使用对象的属性进行操作:

例如:

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

以上所述是小编给大家介绍的python中sort()与sorted()的区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python实现在无须过多援引的情况下创建字典的方法
Sep 25 Python
Python文件读取的3种方法及路径转义
Jun 21 Python
Python中几个比较常见的名词解释
Jul 04 Python
Python输出带颜色的字符串实例
Oct 10 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
对Python中for复合语句的使用示例讲解
Nov 01 Python
Python3.5面向对象编程图文与实例详解
Apr 24 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
Sep 28 Python
python序列类型种类详解
Feb 26 Python
Python魔术方法专题
Jun 19 Python
使用Keras训练好的.h5模型来测试一个实例
Jul 06 Python
Python异常处理机制结构实例解析
Jul 23 Python
Python实现拷贝/删除文件夹的方法详解
Aug 29 #Python
Python读写zip压缩文件的方法
Aug 29 #Python
使用python生成杨辉三角形的示例代码
Aug 29 #Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 #Python
有关Python的22个编程技巧
Aug 29 #Python
Python实现多线程的两种方式分析
Aug 29 #Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 #Python
You might like
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
详解php的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
Laravel 5.5 异常处理 & 错误日志的解决
2019/10/17 PHP
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
jquery实现网站列表切换效果的2种方法
2016/08/12 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
vue实现简单图片上传
2020/06/30 Javascript
[08:02]DOTA2牵红线 zhou神抱得美人归
2014/03/22 DOTA
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
浅谈python连续赋值可能引发的错误
2018/11/10 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
Why do we need Unit test
2013/01/03 面试题
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
秋季婚礼证婚词
2014/01/11 职场文书
20年同学聚会邀请函
2014/02/04 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
优秀英文求职信范文
2015/03/19 职场文书
材料员岗位职责范本
2015/04/11 职场文书
MySQL实现配置主从复制项目实践
2022/03/31 MySQL