当前位置:   article > 正文

sort与sorted的区别及实例

sorted(a)和a.sort()的区别

描述

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

sorted

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

  1. >>> help(sorted)
  2. Help on built-in function sorted in module builtins:
  3. sorted(iterable, /, *, key=None, reverse=False)
  4.    Return a new list containing all items from the iterable in ascending order.
  5.    A custom key function can be supplied to customize the sort orderand the
  6.    reverse flag can be set to request the result in descending order.

sort

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

  1. >>> help(list.sort)
  2. Help on method_descriptor:
  3. sort(...)
  4. 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,而不是在原来的基础上进行的操作。

示例:

示例一

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

 

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

示例二

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

  1. >>> list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
  2. >>> list1.sort()
  3. >>> list1
  4. [(2'Mike'22), (5'Lucy'19), (8'Logan'20)]
  5. >>> list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
  6. >>> sorted(list1)
  7. [(2'Mike'22), (5'Lucy'19), (8'Logan'20)]
  8. >>> list1
  9. [(8'Logan'20), (2'Mike'22), (5'Lucy'19)]

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

基于key函数排序

  1. >>> list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
  2. >>> list1.sort(key=lambda x:x[2])
  3. >>> list1
  4. [(5'Lucy'19), (8'Logan'20), (2'Mike'22)]
  5. >>> list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
  6. >>> sorted(list1, key=lambda x:x[2])
  7. [(5'Lucy'19), (8'Logan'20), (2'Mike'22)]
  8. >>> list1
  9. [(8'Logan'20), (2'Mike'22), (5'Lucy'19)]

基于reverse函数

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

 

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

经典面试题

要求

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

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

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

 

  1. lis = [-13145518, -21315, -3109.43, -4.434.578.579.57, -6.142.299.434.14, -5.57
  2. newlis = sorted(lis, key=lambda x: (x < 0, isinstance(x, float), abs(x))) 
  3. print(newlis)

上面程序运行结果是:

[5510131415182.294.144.578.579.439.439.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 < 0isinstance(x, float), abs(x)) 

相当于函数:

  1. def fun(x)
  2.    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 比较大小 其实是 (-5<0, isinstance(-5, float), abs(-5)) 和 (2.3<0, isinstance(2.3, float), abs(2.3)) 这两个元组比较大小

  1. (-5<0, isinstance(-5, float), abs(-5)) == (TrueFalse5
  2. (2.3<0, isinstance(2.3, float), abs(2.3)) == (FalseTrue2.3

所以相当于

(TrueFalse5) 和 (FalseTrue2.3) 比较大小 

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


sort与sorted的区别及实例

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

转载于:https://www.cnblogs.com/IT-Scavenger/p/10180660.html

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号