sort与sorted的区别及实例

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> sort与sorted的区别及实例

点击上方”python宝典”,关注获取python全套视频,

技术文章第一时间送达!

描述

我们需要对List进行排序,Python提供了两个方法对给定的List L进行排序 : 方法1.用对List的成员函数sort进行排序方法2.用内置函数sorted进行排序(从2.4开始)

sorted

sorted() 函数对所有可迭代的对象进行排序操作


 help(sorted)

Help on built-in function sorted in module builtins:
sorted(iterable, /, *, key=None, reverse=False)

    Return a new list containing all items from the iterable in ascending order.

    A custom key function can be supplied to customize the sort order, and the
    reverse flag can be set to request the result in descending order.

sort

sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数


 help(list.sort)
Help on method_descriptor:

sort(...)
L.sort(key=None, reverse=False) - None -- stable sort *IN PLACE*

参数说明

原型:sort(key,reverse=False)key:用来指定一个函数,此函数在每次元素比较时被调用,此函数代表排序的规则,也就是你按照什么规则对你的序列进行排序;reverse:是用来表明是否逆序,默认的False情况下是按照升序的规则进行排序的,当reverse=True时,便会按照降序进行排序。注;一般来说,cmp和key可以使用lambda表达式

sort 与sorted的区别

sort()与sorted()的不同在于,sort是在原位重新排列列表,而sorted()是产生一个新的列表。

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

示例:

示例一


 a=[1,2,5,3,9,4,6,8,7,0,12]
 a.sort()
 a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12]

 a=[1,2,5,3,9,4,6,8,7,0,12]
 sorted(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12]
 a
[1, 2, 5, 3, 9, 4, 6, 8, 7, 0, 12]

区别:对于一个无序的列表a,调用a.sort(),对a进行排序后返回a,sort()函数修改待排序的列表内容。而对于同样一个无序的列表a,调用sorted(a),对a进行排序后返回一个新的列表,而对a不产生影响。

示例二

假设用元组保存每一个学生的信息,包括学号,姓名,年龄。用列表保存所有学生的信息。


 list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
 list1.sort()
 list1
[(2, 'Mike', 22), (5, 'Lucy', 19), (8, 'Logan', 20)]

 list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
 sorted(list1)
[(2, 'Mike', 22), (5, 'Lucy', 19), (8, 'Logan', 20)]
 list1
[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]

小结:由示例可以看出,当列表由list(或者tuple)组成时,默认情况下,sort和sorted都会根据list[0](或者tuple[0])作为排序的key,进行排序。以上都是默认的排序方式,我们可以编写代码控制两个函数的排序行为。主要有三种方式:基于key函数;基于cmp函数和基于reverse函数

基于key函数排序


 list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
 list1.sort(key=lambda x:x[2])
 list1
[(5, 'Lucy', 19), (8, 'Logan', 20), (2, 'Mike', 22)]

 list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
 sorted(list1, key=lambda x:x[2])
[(5, 'Lucy', 19), (8, 'Logan', 20), (2, 'Mike', 22)]
 list1
[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]

基于reverse函数


 a=[1,2,5,3,9,4,6,8,7,0,12]
 a.sort(reverse=False)
 a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12]

 a=[1,2,5,3,9,4,6,8,7,0,12]
 a.sort(reverse=True)
 a
[12, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
 a.sort(reverse=True)

小结:reverse=False为升序排序(默认);reverse=True为降序排序

经典面试题

要求

a. 所有的正数排前面,所有的负数排后面 

b. 如果两个数同是正数或者同是负数,那么所有非浮点数排前面,所有浮点数排后面 

c. 如果两个数正负数类型相同,是否是浮点数的结果也相同,那么按两个数的绝对值大小比较,绝对值小的排前面,绝对值大的排后面 


lis = [-13, 14, 5, 5, 18, -2, 13, 15, -3, 10, 9.43, -4.43, 4.57, 8.57, 9.57, -6.14, 2.29, 9.43, 4.14, -5.57] 
newlis = sorted(lis, key=lambda x: (x  0, isinstance(x, float), abs(x))) 
print(newlis)

上面程序运行结果是:


[5, 5, 10, 13, 14, 15, 18, 2.29, 4.14, 4.57, 8.57, 9.43, 9.43, 9.57, -2, -3, -13, -4.43, -5.57, -6.14] 

在本例子中有一句 lambda x: (x 0, isinstance(x, float), abs(x)),这其实就是 python 里面的 lambda 表达式

1.什么是 lambda 表达式

python 语言中,lambda 表达式就相当于一个只有一句代码的函数:


lambda x: (x  0, isinstance(x, float), abs(x)) 

相当于函数:


def fun(x): 
    return (x  0, isinstance(x, float), abs(x)) 

这个函数返回的是一个元组

2.什么是 sorted 函数

sorted 函数第一个参数是要排序的列表,默认会把列表中的元素从小到大进行排序 key 参数接受一个 Callable 对象,比如 lambda 表达式,key 默认值为 None ;如果 key 参数为 lambda 表达式,在对列表中每个元素排序的时候,会执行 lambda 表达式的语句,根据 lambda 表达式的返回值,决定每个元素的大小,这个例子里,其实就是元组和元组比较大小,类似于 (True, False, 19) 和 (True, True, 10) 元组比较大小,默认小的排前面,大的排后面

3.元组大小如何比较

元组比较大小,其实是比较元组中对应元素的大小 比如:


t1=(a1, a2, a3) 和 t2=(b1, b2, b3) 

先比较 a1 和 b1 的大小,如果 a1 b1, 那么 t1 t2; 如果 a1 b1,那么 t1 t2; 如果 a1 == a2, 那么继续比较第二个元素大小,元组的大小由第二个元素大小决定,如果第二个元素也相等,那么比较第三个元素大小,依次类推。。。

4.本案例排序规则是什么

lambda x: (x 0, isinstance(x, float), abs(x)) 这个 lambda 表达式定义的排序规则是: a. 所有的正数排前面,所有的负数排后面 b. 如果两个数同是正数或者同是负数,那么所有非浮点数排前面,所有浮点数排后面 c. 如果两个数正负数类型相同,是否是浮点数的结果也相同,那么按两个数的绝对值大小比较,绝对值小的排前面,绝对值大的排后面

比如 -5 和 2.3 比较大小 其实是 (-50, isinstance(-5, float), abs(-5)) 和 (2.30, isinstance(2.3, float), abs(2.3)) 这两个元组比较大小


(-50, isinstance(-5, float), abs(-5)) == (True, False, 5) 
(2.30, isinstance(2.3, float), abs(2.3)) == (False, True, 2.3) 

所以相当于


(True, False, 5)(False, True, 2.3) 比较大小 

这两个元组比较,(True, False, 5) 是大于 (False, True, 2.3) 的,所以排序的时候 2.3 排前面,-5 排后面。

sort与sorted的区别及实例

识别图中二维码,欢迎关注python宝典

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> sort与sorted的区别及实例


 上一篇
我必须得告诉大家的MySQL优化原理 我必须得告诉大家的MySQL优化原理
点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型….. 你是否真
2021-04-05
下一篇 
deepcopy的实现,__new__ __init__ 区别 deepcopy的实现,__new__ __init__ 区别
点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! Python中copy和deepcopy的区别,以及编程实现deepcopy的功能在python中,有浅复制copy()和深度复制deepcopy(),这
2021-04-05