2017-07-29 5 views
-4

Ich frage mich, wie Sie diese Elemente in eine Schleife legen, um den Code zu verkürzen? Sollte eine while-Schleife oder eine for-Schleife verwendet werden. Wie würde ich darüber hinaus die .split() verwenden. Dies ist, was ich bisher habe, aber es scheint ein wenig zu lang zu sein und ein wenig zu reduzieren.Benötigen Sie Hilfe für eine Schleife

def printReport(line): 
    # Prints the heading to show the test scores 
    print("__________________________________________________________") 
    print("Student Name  Score 1  Score 2  Score 3  Total") 
    print("----------------------------------------------------------") 

    name = []  # Declare name a list 
    score1 = []  # Declare test1 a list 
    score2 = []  # Declare test2 a list 
    score3 = []  # Declare test a list 

    with open("grades.txt", "r") as f: 
     for line in f: 
      name.append(line.split(",", 1)[0]) 
     line = name[0] 
     capacity = len(name) 
     index = 0 
     while index != capacity: 

      line = name[index] 
      for nameOut in line.split(): 

       print(nameOut) 
       index = index + 1 
    with open("grades.txt", "r") as f: 
      for line in f: 
       score1.append(line.split(",", -1)[1]) 
      line = score1[0] 
      capacity = len(score1) 
      index1 = 0 
      while index1 != capacity: 
       line = score1[index1] 
       for s1Out in line.split(): 

        print(s1Out) 
        index1 += 1  
    with open("grades.txt", "r") as f: 
      for line in f: 

       score2.append(line.split(",", -1)[2]) 
      line = score2[1] 
      capacity = len(score2) 
      index2 = 0 
      while index2 != capacity: 
       line = score2[index2] 
       for s2Out in line.split(): 
        print(s2Out) 
        index2 += 1 
    with open("grades.txt", "r") as f: 
      for line in f: 
       score3.append(line.split(" ", -1)[3]) 
      line = score3[2] 
      capacity = len(score3) 
      index3 = 0 
      while index != capacity: 
       line = score3[index3] 
       for s3Out in line.split(): 
        print(s3Out) 
        index3 += 1 
+2

Willkommen bei stackoverflow, bitte Code einrücken – bigbounty

+0

Wie sieht grades.txt aus? –

+1

Sein Druck es quer über ich gerade realisiert. Ich hatte den falschen Namen definiert – Hosea

Antwort

1

Wie wäre es mit einer Funktion?

def routine(score, index, sOut, n): 
    with open("grades.txt", "r") as f: 
     for line in f: 
      score.append(line.split(",", -1)[n]) 
     line = score[0] 
     capacity = len(score) 
     index = 0 
     while index != capacity: 
      line = score[index] 
      for sOut in line.split(): 

       print(sOut) 
       index += 1 

routine(score1, index1, s1Out, 1) 
routine(score2, index2, s2Out, 2) 
routine(score3, index3, s3Out, 3) 

Edit: Bitte nicht kopieren und einfügen, als ich einen Variablennamen falsch verstanden haben könnte, aber das ist th Kern von ihm, werden Sie die Umsetzung zu tun haben.

Edit2: Dies ist eine verschachtelte Funktion

def outer(): 
    def inner(): 
     pass 
+0

Schöne Idee. Sie könnten wahrscheinlich den Parameter 'index' weglassen, da er in der Funktion immer auf 0 initialisiert wird. Sind Sie sicher, dass 'sOut' übergeben wird, wird es nur als lokale Schleifenvariable verwendet. –

+0

Ich habe gerade meinen Code oben bearbeitet. Es ist derzeit in einer Funktion. Dies wäre die Funktion, die ich ändern möchte. – Hosea

+0

@Hosea Wussten Sie, dass Sie Funktionen innerhalb von Funktionen ausführen können? –

0

wie Hausaufgaben aussieht, aber hier ist ein Hinweis. Lies die Datei einmal und bearbeite die Zeile ähnlich wie folgt:

>>> line = "name,score1,score2,score3" 
>>> name,*scores = line.split(',') 
>>> name 
'name' 
>>> scores 
['score1', 'score2', 'score3'] 

Die Zeile ist in eine Liste von vier Dingen aufgeteilt. Die name,*scores Syntax weist das erste Ding in der Liste zu name und der Rest zu scores zu.

0

Es sieht so aus, als ob Sie eine Menge Arbeit erledigen, die einfacher sein könnte.

Sie haben nicht angegeben, wie Ihre Datei 'grades.txt' aussieht. So vermuten lässt es wie folgt aussieht:

Mark, 100, 99, 89 
Sam, 87, 75, 70 

Wenn das der Fall ist, müssen Sie Ihre Datei nicht immer und immer wieder lesen - das ist langsam. Sie können die Datei nur einmal durchlesen und jede Zeile bearbeiten. Zum Beispiel:

with open("grades.txt", "r") as f: 
    for line in f: 
     line = line.strip() #strip off newline character 
     arr = line.split(",") #split your fields on the comma 
     arr.append(sum([int(x) for x in arr[1:]])) #make the sum of the scores 
     print('{:20}{:10}{:10}{:10}{:>15}'.format(*arr)) #print using the format feature of python 

Die Formate wie {:20} erzählen die print-Anweisung dieses Feld 20 Zeichen breit zu machen. Auf diese Weise reiht sich die Tabelle selbst für Namen unterschiedlicher Länge auf.

Dies führt zu einer schön formatierten Tabelle. Gefällt mir:

_________________________________________________________________ 
Student Name  Score 1 Score 2 Score 3    Total 
_________________________________________________________________ 
Mark     100  99  89     288 
Sam     87  75  70     232 
+0

Ja der obere Teil ist excatly, wie es zeigt, vielen Dank für die Einsicht – Hosea

Verwandte Themen