python 自定義sorted排序


前言

題目

輸入一個正整數數組,把數組里面的所有屬豬拼接起來成為一個數打印能拼接起來的所有數字中最大/最小的那個。

思考

直觀想法就是求出這個數組中所有數字的全排列,然后拼接起來,再比較大小即可,當然復雜度過高。

另一個想法,我們可以定義一個排序規則,如下:
  如果兩個數m,n能拼接成數字mn,nm,如果mn>nm,則m應該在n前面,反之亦然

根據這個排序規則,我們可以重新排列數組,將排列好的數組拼接起來輸出即可’為了方便比較,並且防止數據溢出(比如C語言),采用字符串的方式拼接。我們很容易可以寫出如下代碼:

python

def compare(strNum1, strNum2):
    newStrNum1 = strNum1 + strNum2
    newStrNum2 = strNum2 + strNum1
    if newStrNum2 > newStrNum1:
        return -1
    elif newStrNum2 == newStrNum1:
        return 0
    else:
        return 1

問題

排序規則定義好了,但是問題來了,一般的 sorted 排序函數 都有相應的 cmp函數,用來定制化排序的比較方法。但是python3的sorted函數已經刪去了cmp參數,真不能跑去用python2吧

解決方案

由於python3中sorted函數除去compare函數,無法自定義排序規則,所以使用內置的函數,將cmp函數轉化為key的值

  • Note:
    • functools.cmp_to_key() 將 cmp函數 轉化為 key。
    • cmp函數的返回值 必須為 [1,-1,0]

python

from functools import cmp_to_key

def compare(strNum1, strNum2):
	"""
	返回最小排列的定義,如果需要最大,將返回值的+1、-1調換即可
	"""
    newStrNum1 = strNum1 + strNum2
    newStrNum2 = strNum2 + strNum1
    if newStrNum2 > newStrNum1:
        return -1
    elif newStrNum2 == newStrNum1:
        return 0
    else:
        return 1

def print_min_nums(nums):
    if not nums:
        return 0

    arr = [str(i) for i in nums]
    newarr = sorted(arr,key=cmp_to_key(compare))
    return "".join(newarr)


if __name__ == '__main__':
    print(print_min_nums([3,32,321]))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM