Python學生管理系統(tǒng)中的排序問題

一個剛?cè)隤ython坑的初學者类早,用python做學生管理系統(tǒng)的時候,在遇到排序的時候碰到了小插曲,讓我給她分析一下bug搏色,其實也很有趣。以下是她寫的代碼(這個代碼是我網(wǎng)上csdn找給她的券册,然后她自己按照任務規(guī)則修改了部分):

student_store = [] # 定義一個儲存學生信息的列表

def printMenu():

? ? """打印功能菜單"""

? ? print('=' * 30)

? ? print('學生信息管理系統(tǒng)')

? ? print('1.添加學生信息')

? ? print('2.刪除學生信息')

? ? print('3.修改學生信息')

? ? print('4.顯示所有學生信息')

? ? print('5.按學生語文成績高-低顯示學生信息')

? ? print('6.按學生數(shù)學成績高-低顯示學生信息')

? ? print('7.按學生英語成績高-低顯示學生信息')

? ? print('8.保存數(shù)據(jù)')

? ? print('0.退出系統(tǒng)')

? ? print('=' * 30)

def addInfo():

? ? """定義一個添加學生信息的函數(shù)"""

? ? newname = input('輸入新學生的名字:')

? ? newsex = input('輸入新學生的性別:')

? ? newnumber = input('輸入新學生的學號:')

? ? newchinese = input('請輸入語文成績:')

? ? newmath = input('請輸入數(shù)學成績:')

? ? newenglish = input('請輸入英語成績:')

? ? newInfo = {}

? ? newInfo['name'] = newname

? ? newInfo['sex'] = newsex

? ? newInfo['number'] = newnumber

? ? newInfo['chinese'] = newchinese

? ? newInfo['math'] = newmath

? ? newInfo['english'] = newenglish

? ? student_store.append(newInfo)

def delInfo():

? ? """定義一個刪除學生信息的函數(shù)"""

? ? delNum = int(input('請輸入要刪除的序號:')) - 1

? ? del student_store[delNum]

def modifystuInfo():

? ? """定義一個修改學生信息的函數(shù)"""

? ? stuId = int(input('請輸入要修改的學生序號:')) - 1

? ? newname = input('輸入修改后學生的名字:')

? ? newsex = input('輸入修改后學生的性別:')

? ? newnumber = input('輸入修改后學生的學號:')

? ? newchinese = input('輸入修改后學生的語文成績:')

? ? newmath = input('輸入修改后學生的數(shù)學成績:')

? ? newenglish = input('輸入修改后學生的英語成績:')

? ? student_store[stuId]['name'] = newname

? ? student_store[stuId]['sex'] = newsex

? ? student_store[stuId]['number'] = newnumber

? ? student_store[stuId]['chinese'] = newchinese

? ? student_store[stuId]['math'] = newmath

? ? student_store[stuId]['english'] = newenglish

def showstuInfo():

? ? """定義一個顯示所有學生信息的函數(shù)"""

? ? print('=' * 30)

? ? print('學生信息如下:')

? ? print('=' * 30)

? ? print("序號".center(4), "名字".center(8), "性別".center(8), "學號".center(8), "語文成績".center(8), "數(shù)學成績".center(8), "英語成績".center(8))

? ? i = 1

? ? for tempInfo in student_store:

? ? ? ? print('%d? %s? %s? %s %s %s %s' % (i, tempInfo['name'].center(14), tempInfo['sex'].center(4), tempInfo['number'].center(10), tempInfo['chinese'].center(10), tempInfo['math'].center(10), tempInfo['english'].center(10)))

? ? ? ? i += 1

# 成績排序

# 以下二個函數(shù)用于sorted排序频轿, key的表達式函數(shù)

def get_chinese(*l):

? ? for x in l:

? ? ? ? return x.get("chinese")

def get_math(*l):

? ? for x in l:

? ? ? ? return x.get("math")

def get_english(*l):

? ? for x in l:

? ? ? ? return x.get("english")

# 按學生語文成績高-低顯示學生信息

def chinese_reduce(student_store):

? ? print("按學生語文成績高-低顯示")

? ? mit = sorted(student_store, key=get_chinese)

? ? showstuInfo()

# 按學生數(shù)學成績高-低顯示學生信息

def math_reduce(student_store):

? ? print("按學生語文成績高-低顯示")

? ? mit = sorted(student_store, key=get_math)

? ? showstuInfo()

# 按學生英語成績高-低顯示學生信息

def english_reduce(student_store):

? ? print("按學生語文成績高-低顯示")

? ? mit = sorted(student_store, key=get_english)

? ? showstuInfo()

# 保存學生信息

def saveToFile():

? ? f = open('backup.data', 'w')

? ? f.write(str(student_store))

? ? f.close()

# 恢復數(shù)據(jù)

def recoverData():

? ? global student_store

? ? f = open('backup.data')

? ? content = f.read()

? ? student_store = eval(content)

? ? f.close()

# 定義主函數(shù),調(diào)用上面的子函數(shù)

def main():

? ? recoverData()

? ? while True:

? ? ? ? printMenu()? # 打印菜單

? ? ? ? key = int(input('請輸入您想選擇的功能:'))

? ? ? ? if key == 1:

? ? ? ? ? ? addInfo()? # 添加學生信息

? ? ? ? elif key == 2:

? ? ? ? ? ? delInfo()? # 刪除學生信息

? ? ? ? elif key == 3:

? ? ? ? ? ? modifystuInfo()? # 修改學生信息

? ? ? ? elif key == 4:

? ? ? ? ? ? showstuInfo()? # 查看學生所有信息

? ? ? ? elif key == 5:

? ? ? ? ? ? chinese_reduce(student_store)

? ? ? ? elif key == 6:

? ? ? ? ? ? math_reduce(student_store)

? ? ? ? elif key == 7:

? ? ? ? ? ? english_reduce(student_store)

? ? ? ? elif key == 8:

? ? ? ? ? ? saveToFile()? # 保存數(shù)據(jù)

? ? ? ? elif key == 0:? # 退出系統(tǒng)

? ? ? ? ? ? quitConfirm = input('您是要退出嗎烁焙?(Yes or No):')

? ? ? ? ? ? if quitConfirm == 'Yes':

? ? ? ? ? ? ? ? break? # 結(jié)束循環(huán)

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? print('輸入有誤航邢,請重新輸入')

main()

她的代碼本身沒有問題,就是recoverData恢復數(shù)據(jù)的時候骄蝇,把數(shù)據(jù)加載到文檔里膳殷,她list里面結(jié)構(gòu)體的數(shù)據(jù)都是字符,造成sort排序的時候key的排序策略是錯的乞榨。

# 恢復數(shù)據(jù)

def recoverData():

? ? global student_store

? ? f = open('backup.data')

? ? content = f.read()

? ? student_store = eval(content)

? ? f.close()

這個操作出來的student_store全是字符串秽之,而我們排序是要求要用數(shù)值的。

所以她排序出來的都是錯的吃既,其實就是排序規(guī)則錯了

后面我給她改了代碼考榨,這個改的話再排序規(guī)則那邊

# 成績排序

# 以下二個函數(shù)用于sorted排序, key的表達式函數(shù)

def get_chinese(*l):

? ? for x in l:

? ? ? ? return int(x.get("chinese"))

def get_math(*l):

? ? for x in l:

? ? ? ? return int(x.get("math"))

def get_english(*l):

? ? for x in l:

? ? ? ? return int(x.get("english"))

核心在于返回的數(shù)據(jù)中都加了int類型鹦倚。

# 按學生語文成績高-低顯示學生信息

def chinese_reduce(student_store):

? ? print("按學生語文成績高-低顯示")

? ? mit = student_store.sort(key=get_chinese)

? ? showstuInfo()

# 按學生數(shù)學成績高-低顯示學生信息

def math_reduce(student_store):

? ? print("按學生語文成績高-低顯示")

? ? mit = student_store.sort(key=get_math)

? ? showstuInfo()

# 按學生英語成績高-低顯示學生信息

def english_reduce(student_store):

? ? print("按學生語文成績高-低顯示")

? ? mit = student_store.sort(key=get_english)

? ? showstuInfo()

以下簡單聊以下python中l(wèi)ist用法河质,接口用的是sort和sorted.

student_store.sort(key=get_english)

重點在于排序策略key,如果沒有制定策略,就會默認按照從小到大的順序。

sort用法如下

list.sort(cmp=None, key=None, reverse=False)

cmp--可選參數(shù)

key--用來進行比較的元素掀鹅,在這邊可作的文章比較多散休,能夠讓你代碼更優(yōu)雅一些

reverse--則是排序規(guī)則,True是降序乐尊,F(xiàn)alse是升序

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末戚丸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扔嵌,更是在濱河造成了極大的恐慌限府,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痢缎,死亡現(xiàn)場離奇詭異胁勺,居然都是意外死亡,警方通過查閱死者的電腦和手機独旷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門署穗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嵌洼,你說我怎么就攤上這事案疲。” “怎么了咱台?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵络拌,是天一觀的道長。 經(jīng)常有香客問我回溺,道長春贸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任遗遵,我火速辦了婚禮萍恕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘车要。我一直安慰自己允粤,他們只是感情好,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布翼岁。 她就那樣靜靜地躺著类垫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琅坡。 梳的紋絲不亂的頭發(fā)上悉患,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音榆俺,去河邊找鬼售躁。 笑死坞淮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的陪捷。 我是一名探鬼主播回窘,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼市袖!你這毒婦竟也來了啡直?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤凌盯,失蹤者是張志新(化名)和其女友劉穎付枫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驰怎,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年二打,在試婚紗的時候發(fā)現(xiàn)自己被綠了县忌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡继效,死狀恐怖症杏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瑞信,我是刑警寧澤厉颤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站凡简,受9級特大地震影響逼友,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秤涩,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一帜乞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筐眷,春花似錦黎烈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至武翎,卻和暖如春烈炭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背后频。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工梳庆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暖途,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓膏执,卻偏偏與公主長得像驻售,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子更米,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容