2015-05-28 17 views
1

我正在創建一個學生評分程序:它從輸入模式開始,要求提供姓名,年齡,科學等級,數學成績和英語成績。
然後有多種可能的操作:添加學生,添加學校課程,打印每個添加的學生,以及 - 在不同主題中打印從最低到最高的結果。最後一個動作是我遇到的問題。如何在Python中對字符串列表和相關數字列表進行排序?

我失敗的原因是用戶在主菜單中輸入'4',然後詢問用戶是否要顯示學生的數學,物理或英語結果。當用戶指定他們想顯示什麼,像下面這樣就會產生:

Jill: 3 
Marvin: 4 
Jack: 6 
Raf: 80 

我知道如何通過數字與sort()函數進行排序,但我怎麼做「吉爾」走在與列表中的'3'相同的地方。

這讓我可以做這樣的事情:

for p in range(len(allStudents)): 
    print(allStudents[p].printName(), ":" , mathsAll[p] , "/100") 

我知道我可以使用字典對於這一點,但再假設我輸入用戶名爲「吉爾」,那麼它將覆蓋第一一。

完整的代碼可以發現:http://pastebin.com/R2uGAQVg 任何幫助將不勝感激!

+0

絕對需要您提供樣本輸入和輸出。 –

+0

我無法對你使用的數據結構做任何猜測,但我懷疑這是不理想的。告訴我們你在做什麼,也許我們可以建議一個更好的結構,使這些任務更容易。 – TigerhawkT3

+0

我會讓程序更簡單。假設有一個菜單隻能接收2個輸入,如果用戶輸入1,則會提示用戶輸入:有科學成績,他們的數學成績,他們的英語成績和學生的姓名。如果用戶輸入4,則它將提示用戶輸入1)數學2)科學3)英語。如果用戶輸入1,那麼它將顯示所有學生所有學生的數學結果從最低到最高。我不能只創建一個字典,因爲如果我輸入兩次相同的名字,那麼它會覆蓋。那麼,你如何創建一個不會覆蓋的字典。 – mre12345

回答

1

您需要將名稱與值配對。如果你不想出於某種原因使用字典,那麼使用元組。

data = [('Jill', 3), ('Marvin', 4), ('Jack', 6), ('Raf', 80)] 

for datum in data: 
    name, score = data 
    # do whatever you like.... 

或者使用字典

data = [{'name': 'Jill', 'score': '3'}, ... ] 

for d in data: 
    print(d['name'] + ": " + d['score']) 

或者使用namedtuple s的名單。

from collections import namedtuple 

Student = namedtuple('Student', ['name', 'score']) 

data = [Student(name="Jill", score=3), ... ] 

for student in data: 
    print(data.name + ": " + data.score) 
    # or print("{student.name}: {student.score}".format(student=student)) 

或任何其他的一些更好的方式來處理你的數據不是兩個不相關的名單!

+0

感謝您的答覆!,我無法使用字典的原因是因爲我的用戶是輸入學生姓名的用戶,所以如果他們鍵入相同的名稱,那麼它會覆蓋。元組和字典之間的區別是什麼,如果像字典一樣指定了兩次密鑰,它是否覆蓋? – mre12345

+0

如果學生的名字不能作爲唯一標識符,我建議使用他們的學生ID作爲關鍵字,或者他們的第一個姓和名(例如'jdoe')。 – TigerhawkT3

+1

@ mre12345你需要更具體地思考。字典不會覆蓋,如果他們有多個*名稱*,他們覆蓋重複*鍵*。所以你不能使用任何非唯一的密鑰,但你仍然可以將數據存儲在字典中。看我的例子。 –

1

您可以將您的學生在一個班級:

class Student: 
    def __init__(self, name, math_grade): 
     self.name = name 
     self.math_grade = math_grade 

那麼如果你有學生student_list的列表,你可以按屬性列表:

student_list = [Student("Steve", 3), Student("Paul", 4), Student("Jack, 5")] 
student_list.sort(key=lambda x: x.math_grade, reverse=True) 
print(student_list) 

然後,如果學生有更多的屬性(年齡,姓名,科學等級,英語等級等)很容易通過更改lambda來進行排序。

如果您的應用程序將保存運行之間的學生信息,則應考慮其他類型的容器,如嵌入式數據庫(如SQL燈)。

相關問題