串列&元組
2019/07/19 謝碧景(c)編製更新
學習目標
一、串列的宣告與讀取
(一)串列 (List)
串列又稱清單或列表,相同於C/C++語言的陣列(Array),功能與變數相似,屬循序性的資料結構。
串列中每一個資料稱為元素(element),而每一個元素即為一個變數,元素在電腦記憶體中佔有連續的記憶體空間。
宣告及存取以『索引』值(index)為主(具循序性),且索引值必須是整數常數或整數運算式,由0開始(即第1個元素)。
透過索引可存取串列個別的元素,且索引不可超過宣告陣列的範圍,否則執行時會顯示 list index out of range 錯誤。
(二)一維串列的宣告與讀取
串列使用前需先宣告,如下,先宣告串列名稱,再將串列的元素循序放置於 [] 中括號;元素間以逗號隔開,每個元素的資料型態可相同或不同。
若宣告時省略元素,則該串列為一個空串列。例如 list1=[] #list1為空串列。
索引值由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] 為例, 來說明各種方法的執行結果。
![](https://www.google.com/images/icons/product/drive-32.png)
◆範例2:小老師以串列計算小考成績,請輸入成績存入串列做為元素,若輸入Enter鍵則結束,最後輸出小考總成績及平均。(檔名:append-1.py)
方法1:以 for迴圈讀取串列元素累加總和。
執行結果:
方法2:以函數計算總和 sum(串列[,額外數值]) ,【參閱:數值函數】。
執行結果:
執行結果:
*註:連續輸入數個數字 (以空白隔開),求其和。
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]
重複上述動作,最後填滿串列。