2015-11-20 70 views
-2

我想重新排列列表中的數字成員(該列表僅包含數字),並且如果字符串形式爲num1 +字符串形式爲num2> =字符串形式爲num2 +字符串形式爲num1,那麼num1應該在num2之前(我不能直接比較數字,因爲數字可能非常大,或者數字的連接字符串格式可能非常大並且溢出)。下面是一個例子,Python的字符串比較問題列表

num1 = 3 
num2 = 30 

因爲NUM1 + NUM2> NUM2 + NUM1# '330'> '303'

所以,3應提前30

另一個例子中,輸入是[ 3,30,34,5,9],預期輸出是[9,5,34,3,30],並想知道如何優雅地編寫Python代碼?我們可以爲Python列表編寫一個自定義的cmp方法嗎?

看來這種方法不工作?排序後,l仍然與原始值相同?

def cmp_values(v1, v2): 
    _v1 = int('{0}{1}'.format(v1, v2)) 
    _v2 = int('{0}{1}'.format(v2, v1)) 
    return cmp(_v2, _v1) 

if __name__ == "__main__": 

    l = [3, 30, 34, 5, 9] 
    sorted(l, cmp=cmp_values) 
    print l 

在此先感謝, 林

+0

我正在使用Python 2.7.x,並且讚賞Python 2系列的優雅解決方案。 :) –

+1

FWIW,即使Python 3不支持'list.sort()'的'cmp'函數參數,它也可以在Python 3中執行此操作。訣竅是實現一個具有豐富比較參數的類。 [這裏](HTTP://計算器。com/a/30141885/4014959)6個月前我寫的一個答案,它包含Python 2和Python 3的這個特定比較實現。 –

+1

另請注意[Antti Haapala的答案](http://stackoverflow.com/a/30152085/4014959),該問題使用真正的按鍵功能執行此類排序,從而使其效率更高。 –

回答

2

您可以使用自定義CMP方法對列表進行排序:

def cmp_values(v1, v2): 
    _v1 = int('{0}{1}'.format(v1, v2)) 
    _v2 = int('{0}{1}'.format(v2, v1)) 
    return cmp(_v2, _v1) 

,然後用它來排序列表

In [5]: l = [3, 30, 34, 5, 9] 
In [6]: sorted(l, cmp=cmp_values) 
Out[6]: [9, 5, 34, 3, 30] 

雖然你需要照顧溢出問題。如果v1和v2的組合超出int範圍。

基於從@LinMa進一步評論

使用sorted不會改變原來的列表,所以你需要返回的列表分配到一個新的變量:

new_list = sorted(l, cmp=cmp_values) 
+2

考慮到OP的評論'我們可以爲Python列表編寫一個自定義的cmp方法嗎?'我認爲他知道這是如何工作的。但我確實同意添加這個也會對其他用戶有所幫助。謝謝你的提示。 :) – AKS

+2

下來的選民可以評論爲什麼答案不正確? – The6thSense

+0

@AKS,試過你的方法,並在下面發佈我的代碼,它返回原始l的相同數組,它似乎沒有排序? (v1,v2)) _v2 = int('{0} {1}'。format(v2, V1)) 返回CMP(_v2,_v1) 如果__name__ == 「__main__」: 升= [3,30,34,5,9] 排序(升,CMP = cmp_values) 打印l' –

1

你的問題非常含糊......

下一次,請確保使用正確的縮進來正確格式化您的代碼(通過點擊'撤銷'箭頭下方的Code找到。

當談到整理列表,只需使用.sort()功能,像這樣:

new_list = [3,6,1,2,4,5] 

new_list.sort() 

print(new_list) 

這應返回:

[1, 2, 3, 4, 5, 6] 

這是如何排序它最簡單的解釋。希望這有所幫助。

1

與AKS相同的想法。更長的代碼,但也許容易遵循步驟。

list = [3, 30, 34, 5, 9, 8] 

job_done = False 
while(job_done == False): 
    job_done = True 
    for i in range(len(list) - 1): 
     as_is = int('{0}{1}'.format(list[i], list[i + 1])) 
     swaped = int('{0}{1}'.format(list[i + 1], list[i])) 
     if as_is < swaped: 
      tmp = list[i] 
      list[i] = list[i + 1] 
      list[i + 1] = tmp 
      job_done = False 
print list