2017-05-28 41 views
0

以字典作爲輸入獲取列表。字典中的鍵是分數。 輸出是一個分數從高到低的列表。這個def語句如何變得更緊湊?

def sort_scores(self, data): 
     scores = [] 
     for i in data: 
      scores = scores + list(map(lambda score_str: int(score_str), i.keys())) 
     sorted_scores = list(map(lambda score_int: str(score_int), reversed(sorted(scores)))) 
     return sorted_scores 
+2

爲什麼它需要更加緊湊?如果您有**工作代碼**,您認爲可以改進(不僅僅是一個功能),請參閱[codereview.se]。 – jonrsharpe

+0

另外,通過「def語句」,你的意思是*函數*? –

+0

我不明白你想要什麼,但你可以簡單地通過這個實現你的目標:return data.keys.sort() – Sagar

回答

2

很多方法來縮短這個:

map(lambda score_str: int(score_str), i.keys()) 

表達lambda score_str: int(score_str)可能只是寫爲int,無需映射lambda如果你正在做的是調用該函數。

如果你想遍歷字典不要打電話i.keys(),只需使用i

這就給了你:

list(map(int, i)) 

但讀起來更容易(雖然稍長)如果你使用列表理解:

scores = scores + [int(score_str) for score_str in i] 

你也可以嵌套在列表解析裏循環,但更短並不總是更好,所以我建議反對。

scores = [int(score_str) for i in data for score_str in i] 

這同樣適用於最後一部分:

sorted_scores = list(map(lambda score_int: str(score_int), reversed(sorted(scores)))) 

可以只是:

sorted_scores = [ str(score_int) for score_int in sorted(scores, reverse=True)] 

你應該養成使用排序時reverse參數的習慣,這不是」這裏沒關係,但有些情況下,反向排序與排序和反轉不一樣。

此外,您可以通過使用在sortkey參數避免鑄造:

scores = [score_str for i in data for score_str in i] 
sorted_scores = sorted(scores, reverse=True, key=int) 
0

一般來說,最好避免使用地圖&拉姆達,它產生非常不可讀的代碼。列表理解是Python中的一種方式。

下面是3個非常可讀的行相同的代碼(你不需要這個功能)

scores = sorted([int(score_str) 
       for i in data 
       for score_str in i], reverse=True) 
+1

關閉,但'.sort()'方法返回None,因此您只丟棄數據! – Duncan

+1

而不是使用'.sort()'(它返回None),你可以使用'sorted(list)'函數返回一個排序列表。 –