偶然看到一個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
>>>
uj5u.com熱心網友回復:
>>> [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
uj5u.com熱心網友回復:
查了一下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)))
uj5u.com熱心網友回復:
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)
uj5u.com熱心網友回復:
哦,好象要考慮30與3的問題
uj5u.com熱心網友回復:
這東西是不是沒法判斷個位和十位,如果有個位數也有十位數滾在一起,那就全錯亂了轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/123806.html
上一篇:用四個字形容一下2019年的你
