2017-05-28 4 views
0

Ruft eine Liste mit dict als Eingabe ab. Schlüssel aus dem Diktat sind Punkte. Ausgabe ist eine Liste mit Werten von hoch bis niedrig.Wie kann diese Aussage kompakter werden?

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

Warum es kompakter sein muss? Wenn Sie ** Arbeitscode ** haben, von dem Sie glauben, dass er verbessert werden könnte (mehr als nur eine einzelne Funktion), siehe [codereview.se]. – jonrsharpe

+0

Mit "def-Anweisung" meinen Sie auch * Funktion *? –

+0

Ich verstehe nicht, was Sie wollen, aber Sie können Ihr Ziel einfach dadurch erreichen: return data.keys.sort() – Sagar

Antwort

2

Viele Möglichkeiten, dies zu verkürzen:

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

Der Ausdruck lambda score_str: int(score_str) wie int geschrieben werden konnte, abzubilden keine Notwendigkeit, eine lambda, wenn alles, was Sie die Funktion ruft tun.

Wenn Sie über das Wörterbuch iterieren möchten, rufen Sie nicht i.keys(), verwenden Sie einfach i.

Das gibt Ihnen:

list(map(int, i)) 

aber es leichter liest (wenn auch etwas länger), wenn Sie eine Liste Verständnis verwenden:

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

Sie können auch Nest der for-Schleife in der Liste Verständnis , aber kürzer ist nicht immer besser, also würde ich davon abraten.

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

Gleiches gilt für den letzten Teil gilt:

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

kann nur sein:

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

Sie in die Gewohnheit, es doesn der Verwendung des reverse Parameter beim Sortieren, erhalten sollte‘ Das ist hier wichtig, aber es gibt Situationen, in denen die umgekehrte Sortierung nicht die gleiche ist wie beim Sortieren und Rückwärtsfahren.

Auch Sie das Gießen unter Verwendung des key Parameter auf den sort vermeiden konnten:

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

Im Allgemeinen ist es am besten mit Karte & Lambda zu vermeiden, erzeugt es sehr unleserlich Code. List Verständnis ist der Weg in Python zu gehen.

Hier ist der gleiche Code in 3 sehr lesbaren Zeilen (Sie keine Funktion dafür brauchen)

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

Schließen, aber die Methode '.sort()' gibt None zurück, also haben Sie einfach die Daten weggeworfen! – Duncan

+1

Anstelle von '.sort()' (das None zurückgibt) können Sie die Funktion 'sorted (list)' verwenden, die eine sortierte Liste zurückgibt. –

Verwandte Themen