python笔记(2)排序函数sorted的用法

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))
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值