python3中sort和sorted的用法
本文参考https://www.cnblogs.com/znyyy/p/7716077.html
python3 sorted取消了对cmp的支持,格式:sorted(iterable,key=None,reverse=False),key接受一个函数,这个函数只接受一个元素,默认为None;reverse是一个布尔值。如果设置为True,列表元素将被倒序排列,默认为False。key的作用原理:key指定一个接收一个参数的函数,这个函数用于从每个元素中提取一个用于比较的关键字。默认值为None。
这里有一个例子
#1.按照年龄来排序
students = [('牛牛', 'A', 15), ('道长', 'B', 12), ('大师兄','B', 10)]
students=sorted(students,key=lambda s:s[2])
print(students)
#结果:[('大师兄', 'B', 10), ('道长', 'B', 12), ('牛牛', 'A', 15)]
这里是另外一个例子
#2.一个字符串排序,排序规则:小写<大写<奇数<偶数,
# 原理:先比较元组的第一个值,FALSE<TRUE,如果相等就比较元组的下一个值,以此类推。
# 先看一下Boolean value 的排序:
# print(sorted([True,Flase]))===>结果[False,True]
# Boolean 的排序会将 False 排在前,True排在后 .
s='9a13C85c7B24A6b' #正确的顺序应该为:abcABC135792468
lis=sorted(s,key=lambda x:(x.isdigit(),x.isdigit() and int(x)%2==0,x.isalpha() and x.isupper(),x.isalpha() and x.lower()))
print(''.join(lis))
# 1.x.isdigit()的作用是把数字放在后边,字母放在前边.
# 2.x.isdigit() and int(x) % 2 == 0的作用是保证奇数在前,偶数在后。
# 3.x.isupper()的作用是在前面基础上,保证字母小写在前大写在后.
# 4.最后的x表示在前面基础上,对所有类别数字或字母排序。
值得注意的是在lambda中有4个连续的函数,前面的优先级要高于后面的优先级
key = len就是按照长度来排
在python3中取消了使用cmp自定义函数来进行比较然后排序的方法(类似于C++的qsort),而是改用了以下方法,使用cmp_to_key函数对其进行了包装:
比如现在有一个题目:
设有n个正整数,将他们连接成一排,组成一个最大的多位整数。
如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613。
使用Python2可以这样完成:
def compare(s1, s2):
if s1+s2>s2+s1:
return -1
elif s1+s2<s2+s1:
return 1
else:
return 0
n = int(raw_input())
arr = raw_input().split()
arr = sorted(arr, compare)
print(''.join(arr))
而在python3中无法直接使用compare函数,因此需要从functools中导入cmp_to_key
,然后再用相同的方法使用。
from functools import cmp_to_key
def compare(s1, s2):
if s1+s2>s2+s1:
return -1
elif s1+s2<s2+s1:
return 1
else:
return 0
n = int(input())
arr = input().split()
arr = sorted(arr, key = cmp_to_key(compare))
print(''.join(arr))