2023-11-08|閱讀時間 ‧ 約 7 分鐘

筆記:深入淺出-程式設計(五)

奇怪,名字呢?

在上一章中,我們成功的將"result.txt"檔案讀進來,並且取得了前三名的分數,但是仔細想想,這個程式卻沒有輸出前三名相對應的人名,這樣要怎麼頒獎給獲勝的人呢?

功能需求變更:請將程式修改成可以一同輸出前三名的名字與其分數

分析:按照目前所學,我們可以再多創建一個陣列用來存放名字,並且利用 sort() 與reverse() 將名字一同輸出。

程式碼:

scores = []
names = []
result_f = open("result.txt")

for line in result_f:
(name,score) = line.split()
names.append(name)
scores.append(float(score))
result_f.close

scores.sort()
scores.reverse()
names.sort()
names.reverse()

print("The highest scores were:")
print(names[0]+' with '+ str(scores[0]))
print(names[1]+' with '+ str(scores[1]))
print(names[2]+' with '+ str(scores[2]))

執行結果:

但是輸出的結果不對,因為 Zack 的分數明明就是 7.21,Stacy 分數為 7.81,Juan 分數為 9.12, 所有的結果都亂掉了。

雜湊

上述的程式有個明顯的問題在於:名字的陣列與分數的陣列是獨立的,因此即使我們利用sort() 與 reverse() 函式將名字陣列做排序,也無法與分數做關聯。

  • 雜湊:我們需要一種資料結構來使兩種資料相互關聯起來,就是雜湊(hash)。

雜湊在不同的程式語言有不同的名稱,像是字典 (dictionary)、對映

(mapping)、鍵值對串列 (key-value)等等。

  • Key - Value : 雜湊利用 key 值與 Value 值來使兩種資料互相關聯。
  • 創建空雜湊:雜湊名稱 = {} ,請注意是大括號喔
  • 將資料加入雜湊:雜湊名稱[ key ] = Value 。
  • 雜湊排序:利用內建 sorted() 函式將雜湊以 key 值做排序。

讓名字與分數關聯起來

分析:先創立一個空雜湊,利用 for 迴圈將讀取的名字與分數加入至雜湊中後,再以 key值做雜湊排序,這樣就可以正確輸出前三名的名字。

程式碼:

scores = {}

result_f = open("result.txt")

for line in result_f:
(name,score) = line.split()
scores[score] = name

result_f.close

for each_score in sorted(scores.keys(),reverse = True):
print('Surfer ' + scores[each_score]+' scored '+ each_score)

執行結果:

當資料變得更複雜

功能需求:主辦單位想要將獎項頒發給前三名的選手,希望能夠有一個程式,可以輸入選手編號後查詢此選手的詳細資料。

事前準備:

請到此網址(http://programming.itcarlow.ie )下載"surfing_data.csv"檔案。

文件內容:


備註:

在第二章介紹咖啡豆價錢程式時,雖然按照此書上的網址進行測試,但是發現咖啡豆網頁已經移除,讓我以為此書相關資源都已被移除,直到在撰寫此文時才發現本書資源依舊可以在上述網址中找到,因此在結束此系列文後,我將會將前面的章節內容做一些更新。

為每個人的資料創建雜湊

取得個人資料:

分析:為了達到主辦單位的功能需求,首先得先匯入 "surfing_data.csv"檔案,然後試著用split()方式先把個人資料分割出來。

程式碼:

surfers_f = open("surfing_data.csv")

for line in surfers_f:
line_split = line.split(';')
info = 'id : '+ line_split[0] + ','
info += 'name : '+line_split[1] + ','
info += 'country : '+line_split[2] + ','
info += 'average : '+line_split[3] + ','
info += 'board : ' +line_split[4] + ','
info += 'age:' + line_split[5]
print(info)

surfers_f.close

執行結果:

創建雜湊並整理成函式:

分析:既然可以分割出個人資料,接下來就是在一開始時先創立一個空的雜湊,然後依序將 key - value 填進去。有了個人資料雜湊後,判斷使用者輸入的 id 編號判斷是否有符合的個人資料雜揍,有的話就回傳此雜湊。

程式碼:

def find_info(id2find):

surfers_f = open("surfing_data.csv")

for line in surfers_f:
s = {}
(s['id'],s['name'],s['country'],s['average'],s['board'],s['age']) =
line.split(';')
if(id2find == int(s['id'])):
return s
surfers_f.close

lookup_id = input('Enter the id of the surfers : ')
surfer = find_info(int(lookup_id))
if(surfer):
print('ID:' + surfer['id'])
print('Name:' + surfer['name'])
print('Country:' + surfer['country'])
print('Average:' + surfer['average'])
print('Board:' + surfer['board'])
print('Age:' + surfer['age'])

執行結果:










分享至
成為作者繼續創作的動力吧!
大家好 我是Ivan。我喜歡閱讀與學習新事物,目前會先以所閱讀的書籍做心得分享~
© 2024 vocus All rights reserved.