輸入、整理與排序
我們現在要處理一個文字檔案,內容是很多行的學生名字與成績,第一個數字表示有多少學生。
需求:按照學生成績由高到低輸出名字跟成績。
5
Rilak 59
Water.M 99
AChin 100
Hortune 98
MuQ 97
將資料讀入
第一行是一個數字,所以我們可以用 int(input())
把數字讀入,接下來每行有一組(名字, 成績),把兩個元素分開,我們對input()
進來的字串使用split()
方法得到一個包含名字和成績的 list。
- 讀入數字 N
- 重複 N 遍,讀入字串 "名字 成績" 並轉為list [名字, 成績]
- 將所有的 [名字, 成績] 加入一個大 list
- 對大 list 做排序
>>> N = int(input()) # 讀入數字N
5
>>> students = [] # 建立一個大 list 包含所有成績
>>> for i in range(N): # 重複 N 遍
... student = input().split() # 讀入後,建立小list
... students.append(student) # 把小list加進去大list內
...
Rilak 59
Water.M 99
AChin 100
Hortune 98
MuQ 97
>>> students
[['Rilak', '59'], ['Water.M', '99'], ['AChin', '100'], ['Hortune', '98'], ['MuQ', '97']]
>>> students[0]
['Rilak', '59']
排序一個 list
跟 str
變數可以使用 input()
方法一樣,list
變數也有非常多的方法可以使用,,但我們需要對 sort()
方法做一些變化:下面是一個直接呼叫 sort() 的錯誤方式。
>>> students.sort()
>>> students
[['AChin', '100'], ['Hortune', '98'], ['MuQ', '97'], ['Rilak', '59'], ['Water.M', '99']]
這是因為 list
之間預設的大小排序是按照第一個元素做比較,所以會變成按照名字字典序的排序結果。
>>> name = ['Rilak', 'Hortune', 'Water.M', 'MuQ', 'AChin']
>>> name.sort()
>>> name
['AChin', 'Hortune', 'MuQ', 'Rilak', 'Water.M']
讓成績變成第一個元素就好啦!
用 reverse()
方法把數字換到最前面!
>>> for i in range(N):
... students[i].reverse()
...
>>> students
[['100', 'AChin'], ['98', 'Hortune'], ['97', 'MuQ'], ['59', 'Rilak'], ['99', 'Water.M']]
>>> students.sort()
>>> students
[['100', 'AChin'], ['59', 'Rilak'], ['97', 'MuQ'], ['98', 'Hortune'], ['99', 'Water.M']]
額,為甚麼還是錯了?他不是應該要按照第一個元素排序嗎?
>>> score = ['100', '98', '97', '59', '99']
>>> score.sort()
>>> score
['100', '59', '97', '98', '99']
摁...他按照第一個元素的字典序
排序...
讓成績變成數字就好啦!
>>> for i in range(N):
... students[i][0] = int(students[i][0])
...
>>> students
[[100, 'AChin'], [59, 'Rilak'], [97, 'MuQ'], [98, 'Hortune'], [99, 'Water.M']]
>>> students.sort()
>>> students
[[59, 'Rilak'], [97, 'MuQ'], [98, 'Hortune'], [99, 'Water.M'], [100, 'AChin']]
現在是從低到高,但我們要從高到低
>>> students.reverse()
>>> students
[[100, 'AChin'], [99, 'Water.M'], [98, 'Hortune'], [97, 'MuQ'], [59, 'Rilak']]
>>> for i in range(N):
... print(students[i][1], students[i][0])
...
AChin 100
Water.M 99
Hortune 98
MuQ 97
Rilak 59
幫 59 分的自己 QQ
最後來整理一下吧
我們對 list 做了哪些操作
- 把成績放到第一項
- 把成績轉成 int
- sort()
- reverse()
這些都可以
N = int(input())
for i in range(N):
student = input().split()
student.reverse()
student[0] = int(student[0])
students.append(student)
students.sort()
students.reverse()
for i in range(N):
print(students[i][1], students[i][0])
大功告成!
更好的寫法
N = int(input())
for i in range(N):
student = input().split()
students.append(student)
students.sort(key = lambda x:int(x[1]))
students.reverse()
for student in students:
print(student[0], student[1])
Question
咦?你問說為甚麼過程要繞那麼一大圈?
為了讓你們練習reverse跟變更list元素啊
認真,我們並不會無時無刻都足夠聰明(例如凌晨三點時)一次就做到好,或是問題不會這麼簡單,這時我們可以一步一步的嘗試接近答案,犯錯、解決錯誤、犯錯、解決錯誤,最後再回過頭把我們的code變完善。