串列&元組

2019/07/19 謝碧景(c)編製更新

學習目標

一、串列的宣告與讀取

(一)串列 (List)

  1. 串列又稱清單列表,相同於C/C++語言的陣列(Array),功能與變數相似,屬循序性的資料結構。

  2. 串列中每一個資料稱為元素(element),而每一個元素即為一個變數,元素在電腦記憶體中佔有連續的記憶體空間。

  3. 宣告及存取以『索引』值(index)為主(具循序性),且索引值必須是整數常數或整數運算式,由0開始(即第1個元素)。

  4. 透過索引可存取串列個別的元素,且索引不可超過宣告陣列的範圍,否則執行時會顯示 list index out of range 錯誤。

(二)一維串列的宣告與讀取

  1. 串列使用前需先宣告,如下,先宣告串列名稱,再將串列的元素循序放置於 [] 中括號;元素間以逗號隔開,每個元素的資料型態可相同或不同

  2. 若宣告時省略元素,則該串列為一個空串列。例如 list1=[] #list1為空串列。

  3. 索引值由0開始(即第1個元素),亦可為負值,表示串列由最後向前讀取,例如 -1表示最後一個元素,-2為倒數第2個元素,以此類推。

【宣告】

串列名稱 = [元素1,元素2,...]

【存取】

串列名稱[索引值] = 元素內容 #索引:0 至 n-1

len(串列名稱):取串列元素個數。

例:a = [ 90 , "Mary" , 87 ]

#宣告串列a中 a[0]=90 , a[1]="Mary" , a[2]=87

#索引:0,1,2 元素:90,"Mary",87

*註:串列名稱 a 是指向串列記憶體起始位址。

範例1:串列宣告與讀取。(檔名:list-1.py)

執行結果:

*註:循序(Sequence)結構:電腦會依循程式碼的順序,由上而下、依序執行每一行程式碼。

(三)讀取串列元素範圍

    • 上例中,除讀取串列單一元素外,亦可讀取某範圍的元素值,如下:

串列名稱 [起始索引:終止索引:間隔值]

#由串列中「起始值 開始,依 間隔值 取到 終止值-1」為止,間隔值可省略,預設值為1

◆承上例:讀取串列元素範圍。(檔名:list-1.py)

二、以 for迴圈讀取串列

(一)方式如下兩種

for 變數 in 串列:

程式區塊

for 變數 in range():

程式區塊

    • 執行時系統會依序將串列的元素做為變數值,每次設定變數值後,就執行程式區塊,亦即串列有多少個元素,就執行程式區塊多少次【參閱、 for 變數 in 數列:】。

    • 例:一維陣列與重複結構的應用。

執行結果相同:

(二)流程圖

例1:以串列顯示月份英文縮寫。(檔名:list-1.py)

  • 方法1:

  • 方法2:

執行結果:

三、串列常用方法

    • 下表中以 list1=[0,10,20,30,20],list2=[1,2] 為例, 來說明各種方法的執行結果。


py_list_method.pdf

◆範例2:小老師以串列計算小考成績,請輸入成績存入串列做為元素,若輸入Enter鍵則結束,最後輸出小考總成績及平均。(檔名:append-1.py)

    • 方法1:以 for迴圈讀取串列元素累加總和。

執行結果:

    • 方法2:以函數計算總和 sum(串列[,額外數值]) ,【參閱:數值函數】。

執行結果:

◆範例3:輸入資料中字串有多個元素,分割後成串列。【參閱:模組索引→import sys、字串函式字串.split()】(檔名:list_del-1.py)

執行結果:

*註:連續輸入數個數字 (以空白隔開),求其和。

t=0

data=input()

num=data.split(' ') #以空白分割資料

for i in range(0,len(num)):

t+=eval(num[i])

print(t)

四、二維串列應用

  • 串列元素可為另一個串列(即串列中還有串列),即為多維串列。多維串列元素的存取是用多個中括號組合。如 二維串列 stusc=[["國",80],["英",85],["數",82]]

  • 例:宣告 a 為二維串列

執行結果:

範例4:隨機抽號,A班有30人每天隨機抽1名同學上台演講,請以亂數產生10天的演講號碼,【參閱:亂數模組】。(檔名:list2d-1.py)

執行結果:

五、元組(Tuple)

(一)語法

元組名稱=(元素1,元素2,元素3,...)

    • 元組結構與串列完全相同,差異在元組的元素個數及元素值不可改變,故被稱為『不能修改的串列』。

    • 元組是將元素放置於小括號中(),且元素間以逗號隔開,元素可為不同資料型態。

    • 元組的執行速度比串列快,且存在元組的資料較為安全,即資料不會因程式設計疏失而改變。

(二)元組與串列的互換

    • Python提供串列與元組的互換,如下:

串列=list(元組)

元組=tuple(串列)

  • 例:串列與元組的互換。

執行結果:

*註:若只有一個元素的tuple,需在元素後面加上逗點『,』,如下:

t = ("z",) #僅一個元素的tuple

print(t)

§實作練習

一、一周消費紀錄:小明將每天早餐消費金額記錄下來,請為小明設計一個程式,輸入每天早餐的消費金額,最後輸出一周總消費金額及每日平均花費。(檔名:list_ex1.py)

二、吃漢堡賽:連續輸入參賽者吃的漢堡數,當輸入Enter鍵表示結束,請將吃的漢堡數由大至小排序後輸出,並顯示吃最多的漢堡數,該優勝者有幾位。(檔名:list-ex2.py)

三、輸入一個十進位整數,請轉換為二進位輸出。【參閱:十進位轉二,八,十六進位,摘自 YouTube】(檔名:list-ex3.py)

四、你考了 n 科筆試題目,每科的滿分都是 100 分。老師說,如果平均大於 59 你就過關了。【資料來源:ZeroJudge→a148】(檔名:a148.py)

輸入說明

輸入第一行為一個數字 n,接著有 n 個正整數。

輸出說明

若被當,請輸出「yes」,否則輸出「no」。

五、以亂數模擬擲骰子連續n次,請統計各點數出現的次數。【參閱:亂數模組】(檔名:list-ex5.py)

六、求費氏數列(Fibonacci)﹦0,1,1,2,3,5,8,13,… 即 f[n]=f[n-1]+f[n-2] 且 n>=2,請列出 Fibonacci 數列的前100項。【參閱:費氏數列-維基百科】(檔名:list-ex6.py)

提示:

當 n>=2 時 fib[n]=fib[n-1]+fib[n-2]

… 略

七、Pascal 三角形。【參閱:巴斯卡三角形-維基百科】(檔名:list-ex7.py)

提示:

以巢狀迴圈存取二維(9x9)陣列,外層迴圈變數 i →列,內層迴圈變數 j →行。

當 i=2,j值→由1到2,p[2][1]→p[i][j] = p[i-1][j-1]+ p[i-1][j]

當 i=3,j值→由1到3,p[3][1]→p[i][j] = p[i-1][j-1]+ p[i-1][j]

重複上述動作,最後填滿串列。