2016-04-15 6 views
-1

Ich habe den Durchschnitt und die höchste Punktzahl pro Name berechnet. Jedoch. Wenn ich die folgenden Werte in einer Textdatei gespeichert haben, ist es das, was die Ergebnisse zeigen: (dh Matts Durchschnitt zweimal und Schleifen über sie)Verwenden Sie mehr als die letzten 3 Punkte, um Daten zu analysieren; Wiederholen Sie auch die Analyse?

matt 5 
matt 2 
matt 3 
andy 1 
andy 2 
andy 3 
andy 4 
matt 4 
matt 's average from the last 3 scores is 4.0 
andy 's average from the last 3 scores is 4.0 
matt 's average from the last 3 scores is 4.0 
andy -'s best score is 4 
matt -'s best score is 5 

Es scheint, den Vornamen zu wiederholen Auch ist es produziert die Daten basierend auf jeder der Noten, nicht nur die letzten 3?

user_scores = {} 
for line in reversed(open("Class1.txt").readlines()): 
    name, score = line.split() 
    score = int(score) 
+0

Verwenden Sie Tree-Methode zum Erstellen von Daten. Kann mit 'ast.literal_eval (line.strip())' – dsgdfg

+0

Dank gibt es einen einfacheren Weg? – Canadian1010101

+0

Soll die Ausgabe alphabetisch nach Name oder nach dem numerischen Wert sortiert werden (oberer Wert/Durchschnitt)? –

Antwort

0

Es ist ein Einrückungsfehler. Sie wollen dieser Block unten auf der ersten Einzugsebene sein:

for name in sorted(user_scores): 
    # get the highest score in the list 
    average = sum(user_scores[name]) /float(len(user_scores[name])) 
    print(name, "'s average from the last 3 scores is", average) 

Auch gibt es viele Orte, wo Sie den Code in einem schlechten Weg geschrieben. Hier ist eine Optimierung:

user_scores = {} 

# 'with' will automatically closes the file after leaving its code block: 
with open("Class1.txt") as scorefile: 

    for line in reversed(scorefile.readlines()): 
     name, score = line.split() 

     # nested if inside if/else is better than if-and plus if not: 
     if name in user_scores: 
      if len(user_scores[name]) < 3: 
       user_scores[name].append(int(score)) 
     else: 
      user_scores[name] = [int(score)] 

# If you want to sort by the numeric value, replace 'sorted(user_scores)' with 
# 'sorted(user_scores, key=lambda k: user_scores[k])': 
for name in sorted(user_scores): 
    # in Python 3 the '/' operator always returns the appropriate format. 
    # to get a pure integer division without decimal places, you would use '//'. 
    # Therefore no need for the float(...) conversion. 
    average = sum(user_scores[name])/len(user_scores[name]) 
    # str.format(...) is more flexible than just printing multiple items: 
    print("{}'s average from the last 3 scores is {}".format(name, average)) 

# No need to store another dictionary with best scores. 
# If you want to sort by the numeric value, replace 'sorted(user_scores)' with 
# 'sorted(user_scores, key=lambda k: user_scores[k])': 
for name in sorted(user_scores): 
    print("{}'s best score is {}".format(name, max(user_scores[name]))) 
+0

Ich erhalte eine Fehlermeldung in Zeile 33: für Zeile in umgekehrter Reihenfolge (Scorefile): TypeError: Argument umgekehrt() muss eine Sequenz sein – Canadian1010101

+0

@ Canadian1010101 Sorry, mein Fehler. Du brauchst die readlines() dort. Das habe ich in meiner Antwort korrigiert. –

+0

Ich habe es getestet und es deckt alle Partituren und nicht nur die letzten drei Partituren ab, so dass der Durchschnitt und die höchste Punktzahl letztendlich für alle von ihnen sind? – Canadian1010101