2016-04-16 3 views
0

Ich versuche, einige Daten zu sortieren, die ich aus einer Datei in alphabetischer Reihenfolge (arbeiten) im Durchschnitt der Daten (Hinzufügen aller Daten, ignorieren die Buchstaben, und das alles zu mitteln) und schließlich die Punkte vom höchsten zum niedrigsten sortiert (Den Benutzernamen zuerst noch einmal eintragen, noch nicht abschließen). Bitte helfen Sie, hier ist er Code:Sortieren von Daten aus einer Textdatei im Durchschnitt, höchste und niedrigste

(wf als etwas gesetzt durch die Datei suchen)

sort = input("What would you like to do with this class? Put them into alpabetical order(a)? Average the scores(b)? Highest to lowest(c)?") 

with open(wf, 'r') as r: 

    if sort == 'a': 
     for line in sorted(r): 
      print(line, end = '') 

    elif sort == 'b': 
     for line in sorted(r): 
      print() 

    elif sort == 'c': 
     def score(line): 
      return int(line.split(',')[1]) 
     with open(wf, 'r') as r: 
      list.sort(r) 
      for line in sorted(r,reverse=True): 
       print(line) 
+2

Können Sie die Frage bearbeiten, um ein Beispiel der Daten in der Datei? – paisanco

+0

Warum nicht Textdatei in Pandas importieren, Pythons Datenanalysepaket, das Aggregate wie Durchschnitt sortieren und ausführen kann? – Parfait

Antwort

1

für durchschnittliche Solving:

Um den Durchschnitt zu erhalten Sie alle Noten hinzufügen müssen zusammen, dann dividiere es durch die Anzahl der Punkte. Sie können dies tun, indem sie durch die Leitungen laufen und alle Noten zusammenfassend, teilen dann durch die Anzahl der Zeilen

Sortierung nach Punkten:

Sie müssen die sortiert() Funktion aufrufen und Ihren eigenen Schlüssel geben. Du hattest eine Funktion, die es fast getan hat, ich habe es nur ein bisschen repariert. Sie senden ihm die Liste der Zeilen und Ihren Schlüssel, der die Punktzahl zurückgibt, und kehren ihn dann um, da Sie ihn am höchsten oder am niedrigsten haben möchten. Dann ist es nur eine Frage der durch Ihre neue sortierte Liste Looping und Drucken jeder Zeile

Insgesamt Kommentare

Die Struktur dieses Programms ist sehr chaotisch und redundant. Sie sollten die Datei nur einmal lesen und dann alles herausfinden. Das Durchlaufen der Datei in jeder if-Anweisung ist nur langsam. Sie sollten auch Funktionen für eine Menge davon verwenden. Machen Sie eine Funktion, die den Durchschnitt zurückgibt, eine Funktion, die die Liste nach Score usw. zurückgibt. Den Code zu hinterlassen, der in der Hauptsache verschlüsselt ist, macht es nur schwer zu lesen

Ich habe diese in dem Code unten implementiert, aber ich schlage vor Sie versuchen, sie auf eigene Faust jetzt, dass Sie verstehen, was diesen Code zu tun und nur als Referenz verwenden, wenn Sie

sort = input("What would you like to do with this class? Put them into alpabetical order(a)? Average the scores(b)? Highest to lowest(c)?") 
wf = "file.txt" 

with open(wf, 'r') as r: 
    if sort == 'a': 
     for line in sorted(r): 
      print(line, end = '') 

    elif sort == 'b': 
     totalScore = 0 
     numOfScores = 0 
     for line in sorted(r): 
      numOfScores += 1 
      totalScore+= int(line.split('score = ')[1]) 
     average = totalScore/numOfScores 
     print(average) 


    elif sort == 'c': 
     def score(line): 
      return int(line.split('=')[1]) 
     with open(wf, 'r') as r: 
      linesList = r.readlines() 
      sortedList = sorted(linesList, key=score) 
      for line in sortedList: 
       print(line.rstrip("\n")) 

Für dieses Beispiel stecken ich Ihnen zur Verfügung gestellten Beispiel Partituren verwendete Datei, wie solche:

bob - score = 12 
harry - score = 1 
ellis - score = 21 
sam - score = 30 
+0

Schöne Antwort. Zwei Dinge jedoch, wenn man numOfScores definiert, ist len ​​(r) nicht einfach realistischer? Und in line.split Soll es nicht [-1] als Index sein? –

+0

len (r) gibt 'TypeError: Objekt vom Typ '_io.TextIOWrapper' hat kein len()' und der Index soll [1] sein, da die Punktzahl hinter dem Zeichen = steht. Der Split sieht aus wie '["bob-score =", "12"] ' – Keatinge

+0

Ich meinte in elif' b ', dann brauchst du kein Argument im Split. Nun, Len (sortiert (r)) sollte funktionieren. –

Verwandte Themen