2016-11-28 22 views
2

我正在使用TDD構建一個Python函數,它接受一串分離的,上升的體重,例如"103 123 4444 99 2000",並以相同的字符串格式輸出相同的數字,但按照其各自的總和按升序排列。因此,上述輸入應該有"2000 103 123 4444 99"的結果。體重轉換器

我已經設法將部件分解爲根據輸入解密正確順序所需的部件,但是我不確定如何根據我設法計算出的單個總和重新排序輸入。

你會注意到第5行我使用了錯誤的整數,因爲這些是總和,而不是原始輸入。這只是我試圖想象如何將列表轉換回單個空格的字符串。

def ordered_weight(strng): 
    str_split = strng.split() 
    int_split = list(map(int, str_split)) 
    sum_lst = sorted([sum(map(int, str(i))) for i in str_split]) 
    return ' '.join(str(x) for x in sum_lst) 

一個附加參數同事提出:

當兩個號碼有相同的「重量」,讓我們班他們就好像它們是字符串,而不是數字:100是180,因爲之前它的「體重「(1)小於180(9)中的一個,而180在90之前,因爲它們具有相同的」重量「(9),它以前以弦的形式出現。

請幫忙!謝謝! MJ

回答

4

使用返回的數字的總和和字符串本身

def ordered_weights(s): 
    spl = s.split() 
    spl.sort(key=lambda x: (sum(map(int, x)), x)) 
    return ' '.join(spl) 

元組的元組的一個關鍵功能進行排序,使得如果第一元素相等,則第二元素進行比較,從而向前。

+0

這是偉大的,謝謝 –

0

這可以在一行中使用列表解析如下進行:

' '.join([t for _,t in sorted(zip([sum([int(y) for y in x]) for x in s.split()], s.split()))]) 

哪裏s是原始輸入字符串。

輸出:

'2000 103 123 4444 99' 

另一個示例s

s = "123 12 1561 613 63 126 74 2346 11 5612367 47 47 235" 

輸出:

'11 12 123 126 63 235 613 47 47 74 1561 2346 5612367'