2016-05-22 9 views
0

Ich erstelle drei Möglichkeiten, wie die Noten von Schülern in einer Klasse (die in einem Wörterbuch mit der Bezeichnung scores gespeichert sind) angezeigt werden können.Ausgabe der höchsten/durchschnittlichen Punktzahl aus der Liste von 3 (Wert) für jeden Schüler (Schlüssel) in einem Wörterbuch sortiert von höchsten zu niedrigsten?

Die erste Methode ist, die höchste Punktzahl jedes Schülers (die aus jeder Schülerliste (ihr Wert), die zwischen 1 und 3 Noten besteht, sortiert in alphabetischer Reihenfolge nach dem Namen des Schülers (deren Eintrag ist Schlüssel). Dies geschieht mit dem folgenden Code:

for name, highScore in [(student,max(scores[student])) for student in sorted(scores.keys())]: 
    print(name, highScore) 

Der Ausgang dieses:

David Sherwitz 9 
Michael Bobby 1 
Tyrone Malone 6 

Die zweite Methode ist die höchste Punktzahl der einzelnen Schüler zu sehen, sortiert vom höchsten zum niedrigsten. Der Code, den ich dafür geschaffen:

sortB = [] 
for name, highScore in [(student, max(scores[student])) for student in scores.keys()]: 
    sortB += name, highScore 
print(sortB) 

Der Ausgang dieses:

['David Sherwitz', 9, 'Michael Bobby', 1, 'Tyrone Malone', 6] 

ich dieser Ausgang mit dem Ausgang des ersten Verfahrens ähnlich aussehen möchte, aber es funktioniert nicht? Es wird auch nicht vom höchsten zum niedrigsten sortiert. Wie kann ich es machen?

Die dritte Methode ist die durchschnittliche Punktzahl jedes Schülers, sortiert von der höchsten zur niedrigsten. Ich habe den Code dafür noch nicht erstellt, aber ich denke, es wäre möglich, den Code für die zweite Methode zu ändern, so dass er stattdessen die durchschnittliche Punktzahl erhält, aber ich weiß nicht wie?

Antwort

1

brauchen nur .sort auf der 2. Säule laufen, die durch key=lambda x: x[1] definiert werden können:

sortB = [(n, max(s)) for n,s in scores.items()] 
sortB.sort(key=lambda x: x[1], reverse=True) 
for name, highScore in sortB: 
    print(name, highScore) 

In ähnlicher Weise durch Durchschnitt zu sortieren, ersetzen nur max mit der durchschnittlichen Funktion:

sortC = [(n, float(sum(s))/len(s)) for n,s in scores.items()] 
sortC.sort(key=lambda x: x[1], reverse=True) 
for name, avgScore in sortC: 
    print(name, avgScore) 

Hier ist die Sortierung mit der ersten Methode und mit ähnlichen Codierungsstil:

sortA = [(n,max(s)) for n,s in scores.items()] 
sortA.sort(key=lambda x: x[0]) 
for name, highScore in sortA: 
    print(name, highScore) 
+0

Danke. Wie kann ich die erste Sortiermethode (A) ähnlich wie B und C in Bezug auf Stil machen, wie ich es getan habe, ohne eine Liste namens "sortA" zu erstellen? – Kaiylar

+1

np. realisierte nur, dass es mit 'scores.items()' prägnanter codiert werden konnte. Siehe aktualisierte Antwort für alle 3 Methoden – Fabricator

Verwandte Themen