Python3的sorted排序问题,没有cmp肿么办

混沌鳄鱼 2017-09-22 02:18:04
偶然看到一个Leetcode的题目Largest Number:
Given a list of non negative integers, arrange them such that they form the largest number.
For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.
Note: The result may be very large, so you need to return a string instead of an integer.
意思就是说有一个list里都是正整数,如何能组合出来最大的数字,因为数字可能比较大,直接输出代表数字的字符串就可以了。

这个在Python2里面用Sorted加cmp就很容易实现,但是在Python3中由于取消了内置对象__cmp__方法,所以sorted函数的传入比较函数的cmp参数也取消了。

那么解决这个问题在Python3中有什么好办法么?

我自己写了一个,但是感觉比较丑陋。就在下面,你看不到的

>>> a_list=[3, 30, 34, 5, 9]
>>> print(''.join(map(str, sorted(a_list, key=lambda x: str(x).ljust(max(map(lambda i: len(str(i)),a_list)), '9'), reverse=True))))
9533430
>>>
...全文
415 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿清 � 2019-11-25
  • 打赏
  • 举报
回复
这东西是不是没法判断个位和十位,如果有个位数也有十位数滚在一起,那就全错乱了
chuifengde 2017-09-22
  • 打赏
  • 举报
回复
哦,好象要考虑30与3的问题
chuifengde 2017-09-22
  • 打赏
  • 举报
回复
import functools as ft
x=    [3, 30, 34, 5,98, 9]
e=ft.reduce(lambda x,y:x+y, sorted(map(str,x),reverse=1))
print(e)
混沌鳄鱼 2017-09-22
  • 打赏
  • 举报
回复
查了一下Python3手册发现了一个比较优雅的方法

from functools import cmp_to_key
cmp2key = cmp_to_key(lambda x,y: int(y+x)-int(x+y))
print( ''.join(sorted(map(str, a_list), key=cmp2key)))
混沌鳄鱼 2017-09-22
  • 打赏
  • 举报
回复

>>> [3, 30, 34, 5, 9]
>>>print(''.join(map(str, sorted(a_list, key=lambda x: str(x).ljust(max(map(lambda i: len(str(i)),a_list)), str(x)[0]), reverse=True))))
9534330

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧