2016-08-17 71 views
1

我想按以下方式對列表進行排序。基於工程單元的元組排序列表

data = [('18.3G', 'pgaur'), ('29.6G', 'adsoni'), ('5.51G', 'keyur'), ('10.8G', 'adityac')] 

sorted(data, key= lambda x:x[0]) 

但它不排序數據。

+0

如何對數據進行排序?是按鍵還是按價值? – d3r1ck

+1

它排序的數據,但字母數字,因爲他們是字符串,而不是數字。你也不會將結果列表保存在任何地方。 –

+0

'sorted(data,key = lambda x:x [1])'將按字母順序按值排序數據。 – d3r1ck

回答

2

要有意義給人類的方式進行排序號碼,你必須確保它們出現爲數字而不是文本:

  • 例如,「5」是代表一個數字的字符串,不是數字 example_list = ['5', '10']如果排序會產生'['10','5'] ,因爲比較結果是'5'對'1'。一次一個角色。

爲了得到你可能想要的結果,你必須做到以下幾點:

data = [('18.3G', 'pgaur'), ('29.6G', 'adsoni'), ('5.51G', 'keyur'), ('10.8G', 'adityac')] 

sorted_list = sorted(data, key=lambda x: float(x[0][:-1])) 
print(sorted_list) 
# prints [('5.51G', 'keyur'), ('10.8G', 'adityac'), ('18.3G', 'pgaur'), ('29.6G', 'adsoni')] 

通知上x[0]切片。它會從x[0]除最後一個('G')以外的所有字符,因爲這會擾亂數字的排序。然後切片x[0]轉換爲浮動與float()和用於排序。最後結果保存在一個新的列表中。

1
sorted(data, key= lambda x:float(x[0][:][:-1])) 

會給你你想要的。

這是由元組x的第一個元素排序[0] [:]拷貝元組的剩餘部分,[:-1]到最後的數字(不包括G)

1

在理想情況下需要一個返回數值的關鍵函數。假設您可以使用k,mg作爲乘數。這段代碼不會像往常一樣將錯誤檢查留給讀者作爲練習。

def sortkey(pair): 
    num = pair[0][:-1] 
    mult = pair[0][-1].lower() 
    num = float(num) 
    mult = {'k': 1000, 'm': 1000000, 'g': 1000000000}[mult] 
    return num*mult 
+0

我認爲'G'代表重力加速度,而不是'Giga',但很有趣。 –

+0

如果它不變,那麼@ ev。的解決方案可能會更快 – holdenweb