Python自定義sorted排序實現方法詳解

2022-09-26 20:03:18 字數 1528 閱讀 7572

題目

輸入乙個正整數陣列,把陣列裡面的所有屬豬拼接起來成為乙個數列印能拼接起來的所有數字中最大/最小的那個。

思考直觀想法就是求出這個陣列中程式設計客棧所有數字的全排列,然後拼接起來,再比較大小即可,當然複雜度過高。

另乙個想法,我們可以定義乙個排序www.cppcns.com規則,如下:

如果兩個數m,n能拼接成數字mn,nm,如果mn>nm,則m應該在n前面,反之亦然

根據這個排序規則,我們可以重新排列陣列,將排列好的陣列拼接起來輸出即可'為了方便比較,並且防止資料溢位(比如c語言),採用字串的方式拼接。我們很容易可以寫出如bilknelyet下**:

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:

retur程式設計客棧n 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]))

本文標題: python自定義sorted排序實現方法詳解

本文位址:

python中自定義排序函式sorted

接收乙個比較函式來實現自定義排序,比較函式的定義是 傳入兩個帶比較的函式x,y 如果x 應該排在y的前面,返回 1 如果x 應該排在 y 的後面,返回1 如果 x 和 y 相等,返回0 舉個例子 實現倒序排序 def reversed cmp x,y if x y return 1 if x y r...

python之自定義排序函式sorted

sorted 也是乙個高階函式,它可以接收乙個比較函式來實現自定義排序,比較函式的定義是,傳入兩個待比較的元素 x,y,如果 x 應該排在 y 的前面,返回 1,如果 x 應該排在 y 的後面,返回 1。如果 x 和 y 相等,返回 0。def custom sort x,y if x y retu...

python3 sorted 如何自定義排序標準

在 python2 中,如果想要自定義評價標準的話,可以這麼做 def cmp a,b 如果邏輯上認為 a b 返回 1 如果邏輯上認為 a b 返回 1 如果邏輯上認為 a b,返回 0 pass a 2,3,1,2 a sorted a,cmp 但是在python3中,cmp這個引數已經被移除了...