2017-05-28 2 views
0

dictを入力としてリストを取得します。辞書のキーはスコアです。 出力は、スコアが高いものから低いものまでのリストです。これを短縮する方法のこの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

は、なぜそれがよりコンパクトにする必要があるんですか? ** working code **を持っていれば、(1つの関数以上に)改善できると思います。[codereview.se]を参照してください。 – jonrsharpe

+0

また、「def文」によって、* function *を意味しますか? –

+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パラメータを使用しての習慣を身に取得する必要があり、それはdoesnのここでは問題はありませんが、逆ソートがソートと逆転と同じではない状況があります。

また、あなたが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)'関数を使うことができます。 –

関連する問題