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

更新 發佈閱讀 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
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
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