2016-05-01 6 views
1

Dies ist der nächste Schritt in meinem currently unresolved question, in dem ich versuche, die Noten von 3 verschiedenen Teams zu sortieren. Ich habe sehr begrenzte Kenntnisse über Python, weil ich neu in der Programmierung bin, so dass meine Problemlösung dieses aktuellen Projekts ziemlich schwierig ist.Sortieren von Daten aus einem CSV alphabetisch, am höchsten zum niedrigsten und Durchschnitt

Um zu beginnen, brauche ich die Beispieldaten (siehe unten), die über zwei Zellen aufgeteilt sind, um alphabetisch nach den Namen sortiert zu werden, ich werde dies für 3 verschiedene Teams in 3 verschiedenen Dateien haben. Ich versuche auch, es vom höchsten zum niedrigsten zu sortieren, abhängig von der Punktzahl, das hat sich für mich bisher als sehr schwierig erwiesen.

Jake,5 
Jake,3 
Jake,7 
Jeff,6 
Jeff,4 
Fred,5 

Die dritte und letzte Art zu sortieren, die ich versuche zu tun ist durchschnittlich. Dafür hatte ich versucht, es so zu machen, wenn der Benutzer seinen Namen 2 oder 3 Mal hatte (da das Programm die letzten 3 Punkte für jeden Benutzer speichert, ist dies ein currently unresolved Problem), dann würde es ihre Punktzahlen hinzufügen und dann teilen wie viele von denen hatte es dort. Leider war das sehr schwierig für mich und ich hatte Mühe, eine Ausgabe zu bekommen, obwohl ich eine Idee hatte, dass dies ihre durchschnittlichen Ergebnisse in eine separate Datei drucken und dann die Ergebnisse erneut lesen würde.

admin_data = [] 
team_choice = input("Choose a team to sort") 
if team_choice == 'Team 1': 
    path = 'team1scores.csv' 

elif team_choice == 'Team 2': 
    path = 'team2scores.csv' 

elif team_choice == 'Team 3': 
    path = 'team3scores.csv' 

else: 
    print("--Error Defining File Path--") 

print("As an admin you have access to sorting the data") 
print("1 - Alpahbetical") 
print("2 - Highest to Lowest") 
print("3 - Average Score") 

admin_int = int(input("Choose either 1, 2 or 3?")) 

if sort_int == 1 and team_choice == 'Team 1': 
    do things 

elif sort_int == 2 and team_choice == 'Team 1': 
    do things 

elif sort_int == 3 and team_choice == 'Team 1': 
    do things 

wird für jede Datei verwendet werden Dieser Teil des Programms, sondern für jede der verschiedenen Sortier Wege kein Glück produzieren keine Lösungen hatte ich:

Das aktuelle Layout Ich habe so weit unten brauchen. Ich werde auch schätzen, wenn die Antwort für die first part meines Projektes auch beantwortet wird.

EDIT (16.43): Ich habe es geschafft, die höchsten zum niedrigsten Teil des Programms zu vervollständigen, ist aber Druck:

[['Fred', '9'], ['George', '7'], ['Jake', '5'], ['Jake', '4'], ['Derek', '4'], ['Jake', '2']] 

Also, wenn dies die Formatierung ich die Daten zu lesen ist wie, Wie kann ich die Datei für doppelte Namen lesen und die Ergebnisse hinzufügen, wenn sie in Arrays wie diesem sind?

+0

Sortierung höchsten zum niedrigsten gelöst werden von [diese Antwort] (http://stackoverflow.com/questions/10695139/sort-a-list-of-tuples-by-2nd-item-integer-value) und wenden Sie "reverse = True" auf "so" sortiert dass es am höchsten zum niedrigsten geht. Was passiert, wenn der Benutzer den "Durchschnittswert" wählt, würde er den Durchschnitt berechnen oder sortieren? –

+0

Es sollte die Datei lesen und wenn ein Name mehr als einmal dort ist, fügt er sie zusammen und dividiert durch die Anzahl von ihnen dort. Meine Idee danach war, die neuen Ergebnisse in eine andere Datei zu schreiben und dann von oben nach unten zu sortieren. Macht das viel Sinn? –

Antwort

1

Der erste Schritt ist das Problem in kleine Schritte zu zerlegen:

  1. How to open and handle the file (unter Verwendung der with Anweisung an der Unterseite des Abschnitts)
  2. How to traverse a csv file
  3. How to sort the entries
  4. How to sort by the second value of each row
  5. How to print each element of a list on a separate line
  6. How to count total scores

auf die letzte Erweiterung, um die Noten sowie die Anzahl der Einträge für jeden Namen wie diese insgesamt können:

import csv 
import collections 
... 
with open(path) as f: 
    entries = collections.Counter() 
    total_scores = collections.Counter() 
    for name,score in csv.reader(f): 
     total_scores[name] += int(score) 
     entries[name] += 1 

Dann können Sie die durchschnittliche Punktzahl für jede Person berechnen mit total_scores[name]/entries[name]

for name in sorted(entries): 
    ave_score = total_scores[name]/entries[name] 
    print(name,ave_score) #sep=", ") 

die beiden anderen Aktionen sind ganz einfach mit einigen der oben aufgeführten Schritte.

import csv 
import collections 
from operator import itemgetter 

... 

if sort_int == 1: 
    with open(path) as f: 
     reader = csv.reader(f) 
     for name, score in sorted(reader): 
      print(name,score) 

elif sort_int == 2: 
    with open(path) as f: 
     entries = sorted(csv.reader(f), 
         key=itemgetter(1), 
         reverse=True) 
     for name,score in entries: 
      print(name,score) 

elif sort_int == 3: 
    with open(path) as f: 
     entries = collections.Counter() 
     total_scores = collections.Counter() 
     for name,score in csv.reader(f): 
      score = int(score) 
      total_scores[name] += score 
      entries[name] += 1 

     for name in sorted(entries): 
      ave_score = total_scores[name]/entries[name] 
      print(name,ave_score) 

Wenn Sie den höchsten zum niedrigsten auf die Durchschnittswerte anwenden möchten, dann müssen Sie einen Verweis auf alle Mittelwerte wie zum Beispiel ein dict machen:

ave_scores = {} 
for name in sorted(entries): 
    ave_score = total_scores[name]/entries[name] 
    ave_scores[name] = ave_score 

for name,ave_score in sorted(ave_scores.items(), key = itemgetter(1), reversed=True): 
    print(name,ave_score) 
+0

Die ersten beiden funktionieren, aber es gibt ein Problem mit dem Durchschnittsteil: Traceback (letzter Anruf zuletzt): Datei "C:/Benutzer/Jake/Downloads/Aufgabe 1 (1) .py", Zeile 182, in für name, punkte in csv.reader (f): TypeError: argument 1 muss ein iterator sein –

+0

My bad. Ich hatte mich nicht richtig eingerückt. –

+0

Wie würde ich den höchsten zum niedrigsten bis zum Ende des Durchschnittsteils hinzufügen? –

Verwandte Themen