python3 sorted()函数 将 cmp函数转化为key

语法

sorted 语法:

sorted(iterable, key=None, reverse=False)

参数说明:

  • iterable -- 可迭代对象。
  • key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

 

用法:

普通排序

>>> sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5] 

反向排序

>>> example_list = [5, 0, 6, 1, 2, 7, 3, 4]
>>> sorted(example_list, reverse=True)
[7, 6, 5, 4, 3, 2, 1, 0]

二维list排序

>>> example_list = [5, 0, 6, 1, 2, 7, 3, 4]
>>> result_list = sorted(example_list, key=lambda x: x*-1)
>>> print(result_list)
[7, 6, 5, 4, 3, 2, 1, 0]

通过 key 的值来进行数组/字典的排序

>>>array = [{"age":20,"name":"a"},{"age":25,"name":"b"},{"age":10,"name":"c"}]
>>>array = sorted(array,key=lambda x:x["age"])
>>>print(array)

[{'age': 10, 'name': 'c'}, {'age': 20, 'name': 'a'}, {'age': 25, 'name': 'b'}]

多列排序

先按照成绩降序排序,相同成绩的按照名字升序排序:

>>> d1 = [{'name':'alice', 'score':38}, {'name':'bob', 'score':18}, {'name':'darl', 'score':28}, {'name':'christ', 'score':28}]
>>> l = sorted(d1, key=lambda x:(-x['score'], x['name']))
>>> print(l)

[{'name': 'alice', 'score': 38}, {'name': 'christ', 'score': 28}, {'name': 'darl', 'score': 28}, {'name': 'bob', 'score': 18}]

 

自定义排序

一般的 sorted 排序函数 都有相应的 cmp函数,用来定制化排序的比较方法。然而 python 3中的 sorted( ) 除去的cmp 参数,推荐使用 key。

Python中有相应的函数 支持将 cmp函数转化为key的值。

复制代码
 1 import functools
 2 def tcmp(a,b):
 3     if a > b :
 4         return -1
 5     elif a < b :
 6         return 1
 7     else:
 8         return 0
 9         
10 nums = [1,2,3,4]
11 sorted_nums = sorted(nums, key = functools.cmp_to_key(tcmp))
复制代码

Note:

1、functools.cmp_to_key() 将 cmp函数 转化为 key。

2、cmp函数的返回值 必须为 [1,-1,0]

例如:179. 最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

 

示例 1:

复制代码
输入:nums = [10,2]
输出:"210"
示例 2:

输入:nums = [3,30,34,5,9]
输出:"9534330"
示例 3:

输入:nums = [1]
输出:"1"
示例 4:

输入:nums = [10]
输出:"10"
复制代码

解答:

复制代码
 1 class Solution(object):
 2     def largestNumber(self, nums):
 3         """
 4         :type nums: List[int]
 5         :rtype: str
 6         """
 7         import functools
 8 
 9         def com(a, b):
10             s1 = a + b
11             s2 = b + a
12             if s1 > s2:
13                 return 1
14             elif s1 == s2:
15                 return 0
16             else:
17                 return -1
18 
19         n = len(nums)
20         if n == 1:
21             return str(nums[-1])
22 
23         data = [str(i) for i in nums]
24 
25         d = sorted(data, key=functools.cmp_to_key(com))
26         res = ""
27         for r in d[::-1]:
28             res += r
29         return str(int(res))
复制代码

注意:最后一行 『str(int(res))』是用来解决[0, 0]这一类用例的

 

str(int(res))
posted @   r1-12king  阅读(232)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示