sorted 使用 lambda 排序案例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zyy247796143/article/details/86468627
list1=[7, -8, 5, 4, 0, -2, -5]
print(sorted(list1,key=lambda x:(x<0,abs(x))))

运行结果如下:

[0, 4, 5, 7, -2, -5, -8]

本例中使用的 lambda ,可以改写成函数形式,运行结果完全一样:

def fun(x):
    return (x<0, abs(x))
print(sorted(list1, key=fun))

1、什么是 sorted 函数 ?

sorted(iterable, *, key=None, reverse=False)
  • sorted 函数第一个参数是要排序的列表,默认会把列表中的元素从小到大进行排序 。
  • key 参数是一个可调用对象(key要的函数而不是调用结果,比如 lambda 表达式),key 默认值为 None ;如果 key 参数为 lambda 表达式,在对列表中每个元素排序的时候,会执行 lambda 表达式的语句,根据 lambda 表达式的返回值,决定每个元素的大小。这个例子里,其实就是元组和元组比较大小。
  • reverse 参数是排序规则,reverse = True 降序 , reverse = False 升序(默认)。

相比于 sort() 函数,sort() 是 list 列表中的函数,并且 sort() 函数是内置函数,会改变当前对象,而 sorted() 函数只会返回一个排序后的当前对象的副本,而不会改变当前对象。

2、元组间比较大小。

按照各个元素之间的大小进行比较,比如t1 = (a1, a2, a3) 和 t2 = (b1, b2, b3)

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

 

3、本案例的排序规则是什么?

lambda x:(x<0,abs(x))
  • lambda 返回的是一个元组。比如:当 x 是 7 的时候 lambda 执行的结果为 (False, 7),当 x 是 -8 的时候,结果为(True, 8)。
  • 所有大于 0 的数排在前面,所有小于 0 的数排在后面。因为这个数小于 0 的时候,x < 0 为 True;这个数大于 0 的时候,x < 0 为 False。又因为 False < True。按照默认的规则,小的在前面,大的在后面,所以所有大于 0 的数排在前面,所有小于 0 的数排在后面。
  • 如果元组的第一位相同,那么再用元组的第二位来比较,绝对值小的在前面,绝对值大的在后面。

综上所述,当 7 和 -8 比较的时候,相当于是  (False, 7) 和 (True, 8) 做比较。先是 False 和 True 做比较,False 在前面,所以 7 在前面 ,-8 在后面。

猜你喜欢

转载自blog.csdn.net/zyy247796143/article/details/86468627
今日推荐