天天看點

python compare函數_如果compare函數需要比較項的值,如何使用Python3排序鍵?

另一種方法是:from itertools import cycle, islice

def extender(n):

def extend(x):

s = str(x)

return "".join(islice(cycle(s), n))

return extend

def biggest_number(input):

if (len(input) == 0):

return 0

extend = extender(len(str(max(input))) * 2)

s = sorted(input, key=extend, reverse=True)

return int("".join(map(str, s)))

基本上,您需要擷取數組的每個元素,并根據需要重複,使它們具有相同的長度。然後你做一個字典排序。(在這一點上,數字排序是相同的,但完成後我們需要字元串。)

例如,對于[3, 30, 34, 5, 9],我們發現最長的數字是2個數字,是以我們根據需要重複這些數字,進而将所有内容擴充為三個數字。以下是使用的鍵:

^{pr2}$

然後對結果進行排序、降序群組合:

^{3}$

直覺來自于從“選擇前導數字最大的數字”開始,問題是我們應該如何處理平局。E、 為什麼我們要在30歲之前選3個呢?答案是,在3之後出現的最大數字是另一個3。(如果有一個更大的數字可用,我們已經選擇了它。)是以把3看作“333333…”有助于我們選擇正确的數字。類似的問題:為什麼我們會選擇10而不是100?這使我們認識到,10之後的最佳結果是另一個以10開頭的數字。(我們已經選了11個或更多個)是以把它想象成“10101010…”和“100100100100…”。結果是,你隻需要擴充到n*2數字,其中n是最長數字的長度。在

我知道這有點令人困惑。我寫了一個測試來確定這些都是正确的。(與原始代碼進行比較。)from functools import cmp_to_key

import random

def largestNumber(nums):

numStr = [str(i) for i in nums]

def str_cmp(x, y):

if y+x < x+y: return -1

elif y+x > x+y: return 1

else: return 0

numStr.sort(key=cmp_to_key(str_cmp))

return "".join(numStr).lstrip('0') or '0'

for i in range(1000000):

input = [random.randint(0, 1000) for _ in range(random.randint(0, 100))]

if biggest_number(input) != int(largestNumber(input)):

print("FAILED: {}".format(input))

if i % 100 == 0:

print(i)

我還沒有找到有用的輸入。我确信這段代碼是正确的。在

所有這些都說明,我不知道你為什麼不想隻用cmp_to_key。:-)