2017-09-20 7 views
-1

このPythonのリストコードで何が問題になっていますか?私はこのコードについて質問してい

menu = "" 
student = [] 
print ("What would you like to do?") 
print ("\t[1] Show full gradebook") 
print ("\t[2] Add Student") 
print ("\t[3] Remove Student") 
print ("\t[4] Modify Student Information") 
print ("\t[5] Display Highest Grade") 
print ("\t[6] Display Lowest Grade") 
print ("\t[7] Quit") 

# loop until the user decides to quit 
while menu != 7: 
    menu = int(input("Enter selection [1-7]")) 
    if menu == 1: 
     print("Name\tGrade") 
     # loop through all students 
     for s in student: 
      print(s[0]+"\t"+str(s[1]))  
    elif menu == 2: 
     # prompt user for student name 
     sname = input("Student Name?") 
     # prompt user for student grade 
     sgrade = int(input("Student Grade?")) 
     # append student information to list 
     student.append([sname, sgrade])  
    elif menu == 3: 
     sname = input("Student to remove?") 
     try: 
      student.remove([sname, sgrade]) 
     except: 
      if sname not in student: 
       print("Not in table.") 
    elif menu == 4: 
     sname = input("Student to modify?") 
     for s in student: 
      print(s[0]+"\t"+str(s[1])) 
     try: 
      student.remove([sname, sgrade]) 
      sname = input("Name: (press Enter to keep original value)") 
      sgrade = int(input("Grade: (press Enter to keep original value)")) 
      student.append([sname, sgrade]) 
     except: 
      if sname not in student: 
       print("Not in table.") 
    elif menu == 5: 
     try: 
      print(sname + " had the highest score in the class: " + str(sgrade)) 
     except: 
      pass 
    elif menu == 6: 
     try: 
      print(sname + " had the lowest score in the class: " + str(sgrade)) 
     except: 
      pass 
    elif menu >= 8: 
     print("Invalid selection.") 

print ("Terminating program... Goodbye!") 

私は、複数の学生と〜6の3つのオプションを試すたびに、それは、リストの一番下にある学生のためにそれを行います。また、生徒の情報を変更しているときに、ある生徒の元の名前や学年を維持する方法を知りたい。

+1

は「それを行う」 - 何をしますか? – DyZ

+0

各アクションを別々の機能に移動すると、問題が表示されます。また、whileループをメイン関数に移動します。以前の繰り返しから 'sgrade'変数を再利用しています – balki

答えて

1

コードは、各操作の前にリストから生徒の詳細を取得していません。代わりに、前の値sgradeが使用されており、sgradeは常にリストの最後の生徒に使用される値になります。したがってオプション3〜6は最後の生徒にのみ有効です。

リストを検索するときに生徒名のみを使用して修正できます。あなたのコード内

student = [s for s in student if s[0] != sname] 

:たとえば、あなたがリストの内包表記を使用することができ、学生(オプション3)を除去する

elif menu == 3: 
    sname = input("Student to remove?") 
    len_orig = len(student) 
    student = [s for s in student if s[0] != sname] 
    if len_orig == len(student): 
     # length unchanged therefore student not in list 
     print("Not in table.") 

オプション4は、上記のバリエーションです。 、辞書は、データ構造の面では

lowest = min(student, key=lambda x: x[1]) 

:同様に、最低はmin()で見つけることができる

highest = max(student, key=lambda x: x[1]) 

:最高グレードで学生を見つけるには、あなたはmax()機能を使用することができますa farリストよりも良い選択。キーに生徒の名前を使用し、値としてグレードを使用します。次に、このような学生を、追加、削除または変更などの操作些細です:

students = {} # initialise 

# add a student 
sname = input("Student Name?") 
sgrade = int(input("Student Grade?")) 
students[sname] = sgrade 

# remove student 
sname = input("Student to remove?") 
if sname in students: 
    del students[sname] 
else: 
    print("Not in table.") 

など

+0

私は辞書を使うべきではありません。 –

+0

オプション4-6のものは何ですか?彼らは結局異なっている。 –

+0

それは残念です。次に、学生リストを検索して操作を実行する必要があります。リストの理解を使ってリストからアイテムを削除する例を示しました。 – mhawke

関連する問題