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

更新於 2024/11/07閱讀時間約 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
5會員
8內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Ivan的沙龍 的其他內容
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
函式 隨著程式功能越來越多,所撰寫的程式碼也會越來越龐大,此時要管理複雜的程式並不是很容易的事,此時可以利用函式來控制程式的複雜度。 提醒 本章節中原本有將訊息傳送給 Twitter 平台的範例,我將其修正為使用print()顯示訊息來模擬(為了不將時間花費在申請 Twitter 帳號)。
字串處理 每個程式都是在處理資料,就拿上一章的猜數字遊戲來說,程式處理的資料就是從使用者輸入的數值與亂數產生器所產生的數值做比較,而這章節主要著重於字串這個資料型態的說明。 字串就是一連串的字元。 字串的第一個字為起始位置(Start),從 0 開始。 字串其他位置的字元與起始字元的距離則
為什麼要學習撰寫程式? 使用別人所撰寫的軟體時,總是會受限於別人所提供的特定功能,但是當你遇到了一些工作是目前現有的軟體都幫不上忙的情況該怎麼辦? 如果你會撰寫程式,這時候就可以自己創造一個專為解決此工作的程式;換句話說,撰寫程式讓你擁有控制電腦的力量。 安裝 Python 首先必須在電腦
簡介: 這是一個關於程式設計的系列文章,或者準確的說是一系列的學習筆記,紀錄著我學習程式設計的筆記與心得。我決定從這本《深入淺出-程式設計》開始紀錄,原因是因為這本書在有限的篇幅中,僅可能的對於什麼是程式設計進行了生動的說明,內容著重於程式邏輯與現實編程中的所會遇到的實際問題,循序漸進且實際演練,
作者 稻盛和夫(1932/01/30 - 2022/08/24)。 1959年創立京都陶瓷股份有限公司(現稱京瓷),1984年創立第二電電(現稱KDDI)與成立稻盛財團,並創辦「京都賞」每年表彰對人類社會進步發展的有成人士,被譽為日本「經營之聖」。 簡介 作者回顧一路走來的人生與多年來的經營
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
函式 隨著程式功能越來越多,所撰寫的程式碼也會越來越龐大,此時要管理複雜的程式並不是很容易的事,此時可以利用函式來控制程式的複雜度。 提醒 本章節中原本有將訊息傳送給 Twitter 平台的範例,我將其修正為使用print()顯示訊息來模擬(為了不將時間花費在申請 Twitter 帳號)。
字串處理 每個程式都是在處理資料,就拿上一章的猜數字遊戲來說,程式處理的資料就是從使用者輸入的數值與亂數產生器所產生的數值做比較,而這章節主要著重於字串這個資料型態的說明。 字串就是一連串的字元。 字串的第一個字為起始位置(Start),從 0 開始。 字串其他位置的字元與起始字元的距離則
為什麼要學習撰寫程式? 使用別人所撰寫的軟體時,總是會受限於別人所提供的特定功能,但是當你遇到了一些工作是目前現有的軟體都幫不上忙的情況該怎麼辦? 如果你會撰寫程式,這時候就可以自己創造一個專為解決此工作的程式;換句話說,撰寫程式讓你擁有控制電腦的力量。 安裝 Python 首先必須在電腦
簡介: 這是一個關於程式設計的系列文章,或者準確的說是一系列的學習筆記,紀錄著我學習程式設計的筆記與心得。我決定從這本《深入淺出-程式設計》開始紀錄,原因是因為這本書在有限的篇幅中,僅可能的對於什麼是程式設計進行了生動的說明,內容著重於程式邏輯與現實編程中的所會遇到的實際問題,循序漸進且實際演練,
作者 稻盛和夫(1932/01/30 - 2022/08/24)。 1959年創立京都陶瓷股份有限公司(現稱京瓷),1984年創立第二電電(現稱KDDI)與成立稻盛財團,並創辦「京都賞」每年表彰對人類社會進步發展的有成人士,被譽為日本「經營之聖」。 簡介 作者回顧一路走來的人生與多年來的經營
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
本篇分享若要準備建築師考試該「從何下手」 ? 包括理解考試重點、調整心態、制定讀書計畫、有效運用時間、結合實務經驗、練習歷屆考題、善用資源、保持適度休息,並關注建築相關時事。且我將備考期劃分為四階段,並詳述了每週的讀書與練習安排,強調穩定進度和身心調整對通過考試的重要性。
Thumbnail
歡迎回來 Kiyo 日文筆記~ 今天要來介紹久沒介紹的接尾辭(せつびじ)— 「通」。通(つう),中文通常會翻譯為行家;專家;權威;(很懂)...的人。 這個接尾辭的使用方式沒什麼受限,最常見就是名詞 + 通,如:食通(しょくつう)美食家,音楽通(おんがくつう)很懂音樂的人。當然也可以有英語通...
嘗試了各種方法,我發現學語言的訣竅,最後還是大量接觸。 這三天用GPT4學俄語,不懂就查, 查完的結果就貼到Obsidian中與其他筆記連結。 Obsidian的隨機功能當作複習非常方便, 可以快速複習之前做的單字句子筆記, 而複習途中如果遇到問題, 那就繼續用G
Thumbnail
本書討論了深度工作與淺薄工作的區分,以及如何減少淺薄工作的時間比例,提高深度工作效率所需的紀律,以及其他時間區段的安排建議。
Thumbnail
幣安Launchpool新代幣$ALT 明天1月25日早上8點挖幣截止,當日晚上6點就會上幣安交易市場了,今晚參與了 $ALT幣安上幣前的AMA。除了前晚和大家分享關於AltLayer,今天再加碼分享濃縮1小時AMA的內容。
Thumbnail
深入介紹卡片盒筆記法 課程推薦: 課程網址:https://www.is79.com/知識管理整合線上課程/ 知識管理整合方案:卡片盒筆法+Obsidian+Notion 課程早鳥價6折+限量100名商品折扣碼:VBJSYMY5(2023/12/31止) 一、為什麼卡片盒筆記法這麼重要? 好的工
Thumbnail
隨著時間的推移,我們的筆記方法可能會改變。 不論是筆記的內容還是方法,都需要隨著學習的深入而進行調整。 持續的反思和嘗試是筆記進步的關鍵。 ▋我們的筆記方法為何會隨著時間而改變? 因為你寫筆記的目的也會換。
Thumbnail
對於筆記,有時我們會引用他人的段落,有時則用自己的話寫。 使用他人的句子可以作為學習的起點,但最終還是應該進行原創的寫作。 ▋你應該如何平衡引用和原創? 我的原則是,每引用一次,就原創五句話。 這五句話,其實可以用131寫作節奏來寫
Thumbnail
隨著筆記卡片的增加,某些軟體可能面臨效能問題。 例如,Obsidian軟體可能在卡片過多時讀取變慢。 但這些技術上的問題不應成為制約我們學習的障礙。
Thumbnail
學術論文的段落比網路文章更為複雜。 利用筆記卡片的方式來解析學術論文能夠提煉出更具價值的知識。 此外,卡片化的學習方法可能對學術研究特別有用。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
本篇分享若要準備建築師考試該「從何下手」 ? 包括理解考試重點、調整心態、制定讀書計畫、有效運用時間、結合實務經驗、練習歷屆考題、善用資源、保持適度休息,並關注建築相關時事。且我將備考期劃分為四階段,並詳述了每週的讀書與練習安排,強調穩定進度和身心調整對通過考試的重要性。
Thumbnail
歡迎回來 Kiyo 日文筆記~ 今天要來介紹久沒介紹的接尾辭(せつびじ)— 「通」。通(つう),中文通常會翻譯為行家;專家;權威;(很懂)...的人。 這個接尾辭的使用方式沒什麼受限,最常見就是名詞 + 通,如:食通(しょくつう)美食家,音楽通(おんがくつう)很懂音樂的人。當然也可以有英語通...
嘗試了各種方法,我發現學語言的訣竅,最後還是大量接觸。 這三天用GPT4學俄語,不懂就查, 查完的結果就貼到Obsidian中與其他筆記連結。 Obsidian的隨機功能當作複習非常方便, 可以快速複習之前做的單字句子筆記, 而複習途中如果遇到問題, 那就繼續用G
Thumbnail
本書討論了深度工作與淺薄工作的區分,以及如何減少淺薄工作的時間比例,提高深度工作效率所需的紀律,以及其他時間區段的安排建議。
Thumbnail
幣安Launchpool新代幣$ALT 明天1月25日早上8點挖幣截止,當日晚上6點就會上幣安交易市場了,今晚參與了 $ALT幣安上幣前的AMA。除了前晚和大家分享關於AltLayer,今天再加碼分享濃縮1小時AMA的內容。
Thumbnail
深入介紹卡片盒筆記法 課程推薦: 課程網址:https://www.is79.com/知識管理整合線上課程/ 知識管理整合方案:卡片盒筆法+Obsidian+Notion 課程早鳥價6折+限量100名商品折扣碼:VBJSYMY5(2023/12/31止) 一、為什麼卡片盒筆記法這麼重要? 好的工
Thumbnail
隨著時間的推移,我們的筆記方法可能會改變。 不論是筆記的內容還是方法,都需要隨著學習的深入而進行調整。 持續的反思和嘗試是筆記進步的關鍵。 ▋我們的筆記方法為何會隨著時間而改變? 因為你寫筆記的目的也會換。
Thumbnail
對於筆記,有時我們會引用他人的段落,有時則用自己的話寫。 使用他人的句子可以作為學習的起點,但最終還是應該進行原創的寫作。 ▋你應該如何平衡引用和原創? 我的原則是,每引用一次,就原創五句話。 這五句話,其實可以用131寫作節奏來寫
Thumbnail
隨著筆記卡片的增加,某些軟體可能面臨效能問題。 例如,Obsidian軟體可能在卡片過多時讀取變慢。 但這些技術上的問題不應成為制約我們學習的障礙。
Thumbnail
學術論文的段落比網路文章更為複雜。 利用筆記卡片的方式來解析學術論文能夠提煉出更具價值的知識。 此外,卡片化的學習方法可能對學術研究特別有用。