輸入、整理與排序

我們現在要處理一個文字檔案,內容是很多行的學生名字與成績,第一個數字表示有多少學生。

需求:按照學生成績由高到低輸出名字跟成績。

5
Rilak 59
Water.M 99
AChin 100
Hortune 98
MuQ 97

將資料讀入

第一行是一個數字,所以我們可以用 int(input()) 把數字讀入,接下來每行有一組(名字, 成績),把兩個元素分開,我們對input()進來的字串使用split()方法得到一個包含名字和成績的 list。

  1. 讀入數字 N
  2. 重複 N 遍,讀入字串 "名字 成績" 並轉為list [名字, 成績]
  3. 將所有的 [名字, 成績] 加入一個大 list
  4. 對大 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變完善。

results matching ""

    No results matching ""