Skip to main content

2-6b 陣列

面對資料量的增加,我們不太可能只用一個變數來儲存一筆資料,例如全班36個人,每人有10個成績,不可能利用360個變數名稱(例如a1_1、a1_2...... a36_9、a36_10)來儲存,這個時候我們需要更有效率的儲存方式,那就是陣列(Array)。陣列就像是置物櫃一樣,只要賦予它一個名稱跟編號(索引值),我們就可以將資料依照位置儲存進去,並且可以隨時取用、更新、刪除,再搭配迴圈的使用,便可快速替我們計算或處理大量的資料,非常方便。

 

Python裡面的「陣列」(Array)一共有四種類型:

  • 串列(List)

    串列(或稱「列表」)可以說是 Python 中最基礎的一種資料結構。所謂列表指的就是一群按照順序排序的元素(類似於其他程式語言的 array,但多一些額外功能)。 → 可排序、可修改、可重複、有索引

  • 元組(Tuple)

    Tuple 類似於 List 的兄弟,但是元素無法修改。  → 可排序、不可修改、可重複、有索引

  • 字典(Dictionary)

    字典類似 map,包含鍵值與對應的值,可以快速取出對應值。  → 不可排序、可修改、不可重複、有索引

  • 集合(Set)

    集合類似數學中的集合,裡面包含不重複的元素值。  → 不可排序、無索引、不可重複

 

 

表示方法:

  • List:  a= ['張三', '李四' , 123]
  • Tuple:  b = ('張三', '李四', 123)
  • Dictionary :  c= {1:'一月', 2:'二月', 3:'三月'}
  • Set: d = {'張三', '李四', 123, 123}

串列(List)的基本用法

 

串列是Python中最基本的資料結構。串列中的每個元素都可儲存一筆資料

串列的第一個索引是0,第二個索引是1,依此類推。

串表是最常用的Python資料類型,使用「中括號」括起來,裡面有逗號隔開,串列的資料不需要具有相同的類型

 

1.串列的建立

要建立一個串列,只要把逗號分隔的不同的資料項使用方括號括起來即可。如下所示:

list1 = [10, 20, 30, 40, 50 ]
list2 = ["a", "b", "c", "d"]
list3 = ['張三', '台中市西屯區寧夏路240號',  "0912-000111", "2005/4/20", 170 , 65.3]

print(list1)
print(list2)
print(list3)

2.串列資料的取用

要存取串列中的值,只要在串列名稱之後加上「中括號」及索引值(記住第一個索引值是0)即可。

例如:

list1 = [10, 20, 30, 40, 50 ]
list2 = ["a", "b", "c", "d", "e", "f"]

print (list1[0])
print (list2[2:5])

3.串列資料的更新

要更新串列中的某個值,可以這樣寫:

list = [70, 60, 80, 90, 100 ]

print ("第4個元素為 : ", list[3])
list[3] = 95
print ("更新後的第4個元素為 : ", list[3])

輸出:

第4個元素為 : 90
更新後的第4個元素為 : 95

4.刪除串列的值

要刪除串列中的某的值:

list = [70, 60, 80, 90, 100 ]
print ("原始列表 : ", list)
del list[2]
print ("刪除第三個元素 : ", list)

輸出:

原始列表 : [70, 60, 80, 90, 100]
刪除第三個元素 : [70, 60, 90, 100]

 

5.增加串列的資料

用法:

串列名稱.append(資料)

例如:

fruit = []   #建立一個空串列
fruit.append("apple")
print(fruit)

 

串列與迴圈的整合

 

1.使用for迴圈(含索引值)

假設現在有五個成績,要列出這五個成績,我們可以這樣寫:

score = [70, 60, 80, 90, 100 ]
for i in range(5):
    print(score[i])

如果不知道這個串列一共有幾個元素怎麼辦? 沒關係,我們可以使用 「len()」(length)這個函數。以上一題為例,有一個名為score的串列,只要用len(score)就可以知道裡面有幾個元素。

score = [70, 60, 80, 90, 100 ]
print(len(score))

結果為5。

所以上一個範例可以改寫成:

score = [70, 60, 80, 90, 100 ]
for i in range(len(score)):
    print(score[i])

 

2.使用for迴圈(不含索引值)

其實for迴圈可以不必搭配 range(),直接這樣寫:

score = [70, 60, 80, 90, 100 ]
for i in score:
    print(i)

如此一來 i 就會從串列第一個元素開始,每執行一圈就會取得一筆新的元素,直到串列結束為止。

這種用法雖然方便,但是無法指定要取得串列中的第幾個元素,所以各有利弊。

 

練習1:計算成績平均:
讓使用者依照座號輸入5筆成績並儲存到列表(List),計算出平均

版本1:不用list

sum=0

for i in range(___ , ___):
    score = int(input("請輸入第" + str(i) + "筆成績:"))
    sum = ______

print (______)

版本2:使用list

sum=0
score=[]
for i in range(1, 6):
    s = int(input("請輸入第" + str(i) + "筆成績:"))
    score.append(____)

for i in range(____):
    sum += _________
    
print (sum/5)

 

二維陣列

前面介紹的是一維陣列,如果資料量一多的話,就變得不夠用了,例如每個同學都有10個成績,我們不可能用36個陣列來儲存。

因此我們需要使用到二維以上的陣列(串列),假設有三個同學,每個人有五個成績,可以這樣寫:

score = [
         [70, 60, 80, 90, 100 ],
         [91, 85, 73, 100, 63 ],
         [66, 91, 55, 81, 75 ]
        ]

每個人的成績都用一組中括號括起來,然後這三組中括號再用逗點隔開,最後外面再用一組中括號包起來。當然你也可以選擇不要換行,全部15個數字寫成同一列也是可以的,但是會變得不易閱讀。

如果我們想取得第二個同學的第四個成績(100)要怎麼寫呢? 是不是 score[2][4]呢? 不是,答案是 score[1][3],可以自己試試看!

接著問題來了,一維陣列用一個for迴圈可以解決,那麼二維陣列呢? 很簡單,就用二維迴圈來解決!所以如果我想計算出這三個同學的總分各是幾分,可以這樣寫:

for i in range(3):
    sum=0
    for j in range(5):
        sum+=score[i][j]
    print(sum)

第一個中括號內的數字代表資料在第幾列(Y座標),第二個數字代表這一列的第幾個數字(X座標),如此一來就可以輕鬆計算出每個人的總分了,是不是很方便呢? 同樣的道理,我們可以把陣列擴充為三維、四維,甚至更高維度,不過要看程式的需求,否則維度太高將難以撰寫。

 

串列的常用函數

  • append:在最後面附加一個元素
  • clear:清空串列裡面的所有元素
  • copy:複製一個串列,例如 list2 = list1.copy
  • count:傳回某個數在串列中出現的次數,如list.count(60)
  • index:傳回某個數在串列中第一次出現的索引值,如list.index(60)
  • insert:在串列指定位置插入元素
  • remove:移除第一個找到的元素,例如list.remove("a")
  • reverse:反轉串列,如 list.reverse()
  • sort:排序串列,如list.sort(), list.sort(reverse=True)
  • max:找出串列裡面的最大值,如 print(max(score))
  • min:找出串列裡面的最小值,如 print(min(score))