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

更新於 發佈於 閱讀時間約 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
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
就如同標題一樣,input的作用就是從使用者那裡獲取輸入,直到使用者輸入一段文本並按下 ENTER 鍵。 然而用戶輸入的數據(文本)都將作為字串被返回,並存儲在變數中。 接著我們舉個例,比如說我們在一段數據中需要獲取使用者的名稱,範例如下: name = input("請輸入你的名字:") #
Thumbnail
題目敘述 Count Number of Teams 給定一個輸入陣列rating,裡面代表每位成員的評分 挑選三位成員,對應到三個index i, j, k 且 i < j < k 如果rating[i] < rating[j] < rating[k] ,則此三人可以組成一隊。 或者ra
Thumbnail
給定兩個輸入陣列,第一個陣列代表每個人的姓名,第二個陣列代表每個人的身高。依照身高從高到矮進行排列,輸出每個人的名字。本文介紹了一個根據身高排列人名的算法,並提供了相關的程式碼和時間複雜度分析。
Thumbnail
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
Thumbnail
題目敘述 輸入給定一個整數陣列,分別代表每位運動員在比賽中的成績。 分數最高的給予金牌"Gold Medal" 分數次高的給予金牌"Silver Medal" 分數第三高的給予金牌"Bronze Medal" 剩餘的名次依照順序給予"4", "5", ..., "n" 的編號。 輸出時以字串
Thumbnail
題目敘述 題目會給定我們兩個字串。 第一個是指定順序的字串order。 第二個是輸入字串s。 要求我們依據order給定的順序,重新排列s。 如果出現order中沒有出現的字母,任意位置皆可。 合法答案可能不只一組,輸出其中一種即可。 題目的原文敘述 測試範例 Example
Thumbnail
題目敘述 題目會給我們一個字串s作為輸入,要求我們以white space空白為切割符號,切割出每個單字,並且反轉其順序後,以字串形式最為最後的輸出。 題目的原文敘述 測試範例 Example 1: Input: s = "the sky is blue" Output: "blue i
Thumbnail
題目敘述 題目會給兩個陣列nums1和nums2。 題目要求我們從中同步選擇長度為k的子序列,並且最大化子序列的分數, 回傳最高的分數值。 分數的定義: 分數 = (nums1[i0] + nums1[i1] +...+ nums1[ik - 1]) * min(nums2[i0] ,
Thumbnail
題目敘述 題目會給我們一個輸入陣列tokens,裡面以逆序波蘭表達式的方式儲存各個token,請問最後計算完的值是多少? 例如: ["6", "2", "/"] 代表 6 / 2 =3 題目的原文敘述 測試範例 Example 1: Input: tokens = ["2","1"
Thumbnail
題目敘述 題目會給定我們一個比賽紀錄陣列matches,裡面以pair的方式儲存,每個pair的第一個欄位代表這場比賽的贏家ID,第二個欄位代表這場比賽的輸家ID。 題目要求我們找出所有沒有輸的玩家ID,和只輸一場的玩家ID。 計算時,只考慮有比賽紀錄的玩家。 輸出時,依照遊戲玩家的ID,從
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
就如同標題一樣,input的作用就是從使用者那裡獲取輸入,直到使用者輸入一段文本並按下 ENTER 鍵。 然而用戶輸入的數據(文本)都將作為字串被返回,並存儲在變數中。 接著我們舉個例,比如說我們在一段數據中需要獲取使用者的名稱,範例如下: name = input("請輸入你的名字:") #
Thumbnail
題目敘述 Count Number of Teams 給定一個輸入陣列rating,裡面代表每位成員的評分 挑選三位成員,對應到三個index i, j, k 且 i < j < k 如果rating[i] < rating[j] < rating[k] ,則此三人可以組成一隊。 或者ra
Thumbnail
給定兩個輸入陣列,第一個陣列代表每個人的姓名,第二個陣列代表每個人的身高。依照身高從高到矮進行排列,輸出每個人的名字。本文介紹了一個根據身高排列人名的算法,並提供了相關的程式碼和時間複雜度分析。
Thumbnail
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
Thumbnail
題目敘述 輸入給定一個整數陣列,分別代表每位運動員在比賽中的成績。 分數最高的給予金牌"Gold Medal" 分數次高的給予金牌"Silver Medal" 分數第三高的給予金牌"Bronze Medal" 剩餘的名次依照順序給予"4", "5", ..., "n" 的編號。 輸出時以字串
Thumbnail
題目敘述 題目會給定我們兩個字串。 第一個是指定順序的字串order。 第二個是輸入字串s。 要求我們依據order給定的順序,重新排列s。 如果出現order中沒有出現的字母,任意位置皆可。 合法答案可能不只一組,輸出其中一種即可。 題目的原文敘述 測試範例 Example
Thumbnail
題目敘述 題目會給我們一個字串s作為輸入,要求我們以white space空白為切割符號,切割出每個單字,並且反轉其順序後,以字串形式最為最後的輸出。 題目的原文敘述 測試範例 Example 1: Input: s = "the sky is blue" Output: "blue i
Thumbnail
題目敘述 題目會給兩個陣列nums1和nums2。 題目要求我們從中同步選擇長度為k的子序列,並且最大化子序列的分數, 回傳最高的分數值。 分數的定義: 分數 = (nums1[i0] + nums1[i1] +...+ nums1[ik - 1]) * min(nums2[i0] ,
Thumbnail
題目敘述 題目會給我們一個輸入陣列tokens,裡面以逆序波蘭表達式的方式儲存各個token,請問最後計算完的值是多少? 例如: ["6", "2", "/"] 代表 6 / 2 =3 題目的原文敘述 測試範例 Example 1: Input: tokens = ["2","1"
Thumbnail
題目敘述 題目會給定我們一個比賽紀錄陣列matches,裡面以pair的方式儲存,每個pair的第一個欄位代表這場比賽的贏家ID,第二個欄位代表這場比賽的輸家ID。 題目要求我們找出所有沒有輸的玩家ID,和只輸一場的玩家ID。 計算時,只考慮有比賽紀錄的玩家。 輸出時,依照遊戲玩家的ID,從