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

更新於 發佈於 閱讀時間約 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]))

執行結果:

raw-image

但是輸出的結果不對,因為 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)

執行結果:

raw-image

當資料變得更複雜

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

事前準備:

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

文件內容:

raw-image


備註:

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

為每個人的資料創建雜湊

取得個人資料:

分析:為了達到主辦單位的功能需求,首先得先匯入 "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

執行結果:

raw-image

創建雜湊並整理成函式:

分析:既然可以分割出個人資料,接下來就是在一開始時先創立一個空的雜湊,然後依序將 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'])

執行結果:

raw-image










留言
avatar-img
留言分享你的想法!
avatar-img
Ivan的沙龍
5會員
8內容數
Ivan的沙龍的其他內容
2023/10/30
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
Thumbnail
2023/10/30
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
Thumbnail
2023/10/21
函式 隨著程式功能越來越多,所撰寫的程式碼也會越來越龐大,此時要管理複雜的程式並不是很容易的事,此時可以利用函式來控制程式的複雜度。 提醒 本章節中原本有將訊息傳送給 Twitter 平台的範例,我將其修正為使用print()顯示訊息來模擬(為了不將時間花費在申請 Twitter 帳號)。
Thumbnail
2023/10/21
函式 隨著程式功能越來越多,所撰寫的程式碼也會越來越龐大,此時要管理複雜的程式並不是很容易的事,此時可以利用函式來控制程式的複雜度。 提醒 本章節中原本有將訊息傳送給 Twitter 平台的範例,我將其修正為使用print()顯示訊息來模擬(為了不將時間花費在申請 Twitter 帳號)。
Thumbnail
2023/10/14
字串處理 每個程式都是在處理資料,就拿上一章的猜數字遊戲來說,程式處理的資料就是從使用者輸入的數值與亂數產生器所產生的數值做比較,而這章節主要著重於字串這個資料型態的說明。 字串就是一連串的字元。 字串的第一個字為起始位置(Start),從 0 開始。 字串其他位置的字元與起始字元的距離則
Thumbnail
2023/10/14
字串處理 每個程式都是在處理資料,就拿上一章的猜數字遊戲來說,程式處理的資料就是從使用者輸入的數值與亂數產生器所產生的數值做比較,而這章節主要著重於字串這個資料型態的說明。 字串就是一連串的字元。 字串的第一個字為起始位置(Start),從 0 開始。 字串其他位置的字元與起始字元的距離則
Thumbnail
看更多
你可能也想看
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
奇怪,名字呢? 在上一章中,我們成功的將"result.txt"檔案讀進來,並且取得了前三名的分數,但是仔細想想,這個程式卻沒有輸出前三名相對應的人名,這樣要怎麼頒獎給獲勝的人呢? 功能需求變更:請將程式修改成可以一同輸出前三名的名字與其分數 分析:按照目前所學,我們可以再多創建一個陣列用來存
Thumbnail
奇怪,名字呢? 在上一章中,我們成功的將"result.txt"檔案讀進來,並且取得了前三名的分數,但是仔細想想,這個程式卻沒有輸出前三名相對應的人名,這樣要怎麼頒獎給獲勝的人呢? 功能需求變更:請將程式修改成可以一同輸出前三名的名字與其分數 分析:按照目前所學,我們可以再多創建一個陣列用來存
Thumbnail
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
Thumbnail
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
Thumbnail
題目會給定一個陣列,要求我們把裡面的數字依照奇偶數去排序, 偶數的排在前面,奇數的排在後面。
Thumbnail
題目會給定一個陣列,要求我們把裡面的數字依照奇偶數去排序, 偶數的排在前面,奇數的排在後面。
Thumbnail
sort reverse count index copy len min max sum any all
Thumbnail
sort reverse count index copy len min max sum any all
Thumbnail
題目:你的團隊正在開發一個新的高級文本編輯器,你的任務是實現行號功能。請編寫一個函數,該函數接受一個字符串列表作為輸入,並返回每行字符串前面附帶正確的行號。行號從 1 開始計數。格式為 n: 字符串。請注意冒號和空格之間的間隔。
Thumbnail
題目:你的團隊正在開發一個新的高級文本編輯器,你的任務是實現行號功能。請編寫一個函數,該函數接受一個字符串列表作為輸入,並返回每行字符串前面附帶正確的行號。行號從 1 開始計數。格式為 n: 字符串。請注意冒號和空格之間的間隔。
Thumbnail
題目:在此 kata 中,您將創建一個包含列表並返回具有相反順序的列表的函數。範例(輸入->輸出) * [1, 2, 3, 4] -> [4, 3, 2, 1] * [9, 2, 0, 7] -> [7, 0, 2, 9]
Thumbnail
題目:在此 kata 中,您將創建一個包含列表並返回具有相反順序的列表的函數。範例(輸入->輸出) * [1, 2, 3, 4] -> [4, 3, 2, 1] * [9, 2, 0, 7] -> [7, 0, 2, 9]
Thumbnail
這題就是經典的考排序驗算法, 不管在教科書、上機考、面試白板題都是一個很基本又滿熱門的題目。 題目會給定一個輸入陣列,要求我們實作一個排序演算法,把陣列元素從小到大排好。
Thumbnail
這題就是經典的考排序驗算法, 不管在教科書、上機考、面試白板題都是一個很基本又滿熱門的題目。 題目會給定一個輸入陣列,要求我們實作一個排序演算法,把陣列元素從小到大排好。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News