當你有很多筆資料,而且他們都有一樣或是類似的性質時,我們會將他們組織成一個資料結構。
而在這裡,我們使用 List
。
身為一個小老師,你要幫老師計算全班30人的數學科平均,你會怎麼做?
方法一:土法煉鋼(小算盤還更快)
Bob = 80
Tom = 60
...
print((Bob + Tom + ...) / 30)
方法二:List
score = [80, 60, ...]
print(sum(score)/30)
這裡的「相同性質」是什麼,除了這些資料代表分數,他們都是數字(int, float)!
字串最顯眼的地方是''
或""
;列表最顯眼的地方是[]
!
所有要被放進列表的元素都會被放在中括號 []
之內。
# listName = [value1, value2, ...]
myFirstList = [True, 'Python', 0.01]
emptyList = []
接下來就從三個觀點來看列表:
想知道他有幾個元素並不難,就數出來就好了![True, 'Python', 0.01]
這個列表很明顯就有三個元素,所以他的長度是3
。
加深一點難度,[[True, 'Python', 0.01], 100, "8.8"]
這個列表的長度呢?
其實答案是三個,三個元素分別為[True, 'Python', 0.01]
, 100
, "8.8"
除了用數的,還有什麼方法可以知道他的長度?
那就來介紹列表的第一個方法(method)吧!
語法:len(listName)
- 參數可以放置一個列表或是列表變數
- 回傳值是一個整數
空列表的長度為 0
# Example 1
list1 = [1, 2, 3, 4]
print(len(list1))
# Example 2
list2 = [[True, 'Python', 0.01], 100, "8.8"]
lenOfList2 = len(list2)
# Example 3
lenOfList3 = len([1, 2, 3, 4])
# Example 4
print(len([]))
從上方的例子來看,列表的元素並不強制要相同的資料型態。
但是一般來說,一個列表我們會放置相同資料型態的資料,例如:一個列表score
用來放整數資料;一個列表name
用來放字串資料。因為放置在同一個列表的資料通常具有一定的關聯性!
score = [60, 80, 70, 45]
name = ['Bob', 'Tom', 'John']
知道了列表內容,再來就是如何調用列表的元素。
想像列表是一個大櫃子,櫃子上有很多抽屜,抽屜上有編號。
索引值就相當於抽屜上的編號,且這些編號是由 0
開始,編號最大的數字為 length - 1
假設有一個列表為 myList = ['Bob', 60, 'Tom', 80]
編號0
的元素為 'Bob'
,通常表示為 myList[0]
編號1
的元素為 60
,通常表示為 myList[1]
編號2
的元素為 'Tom'
,通常表示為 myList[2]
編號3
的元素為 80
,通常表示為 myList[3]
如果調用到範圍外的索引值,會如何?
IndexError: list index out of range 代表你碰到不該碰的東西
小補充:
Python 提供負數索引值。
編號 -1
的元素即是編號 length - 1
的元素
最小至編號
練習一下:
下列程式碼的輸出為何?
myList = [[1, 2, ["Apple", "Banana"]], []]
print(myList[0][2][0])
print(myList[0][1])
print(len(myList[1]))
print(len(myList[0][2]))
答:
Apple
2
0
2
使用索引值來更改列表內容!
前提是這個索引值必須是在合理範圍內。
舉個例子:
myList = [1,2,3,4,5]
for element in myList:
print(element, end = " ")
myList[2] = 100
for element in myList:
print(element, end = " ")
可以從輸出看出差別。
使用 for 迴圈印出列表元素
方法一:使用索引值
myList = ['Bob', 60, 'Tom', 80]
for idx in range(len(myList)):
print(myList[idx], end = ' ')
方法二:迭代列表元素
myList = ['Bob', 60, 'Tom', 80]
for element in myList:
print(element, end = ' ')
這兩個方法在這個實例來說是一樣的。
上述兩個迴圈其實都有用到迭代的技巧,只是被迭代的內容不相同。
方法一中,被迭代的是range函式產生出的一串數字;方法二中,被迭代的是列表的元素。
迭代是什麼意思?
做個比喻:
現在你旁邊的佈告欄上貼有一串資料,而你手中只有很多張紙片跟筆(紙片大小只夠你抄寫一筆數字)。
你會拿出一張紙,將「一筆」資料抄在你的紙上。
程式的世界:
佈告欄:列表|資料:列表元素|一張紙片:一塊記憶體/一個變數
拿出一張紙:調用一塊記憶體或宣告一個變數
抄寫:賦值給變數
一個小問題:
從結果來看,「迭代用的變數」跟「列表中的元素」有一樣的數值。如果將迭代用的變數的數值更改為字串'Hello'
,列表元素的數值會有所變化嗎?
答案是不會。因為這兩個變數並不相干,這件事情就像把紙片上的資料塗改後,佈告欄上的資料不會因此改變啊!
下面哪一個程式會讓列表中的數值都變為原本的10倍?
選項一:
myList = [1, 2, 3, 4]
for idx in range(len(myList)):
myList[idx] *= 10
選項二:
myList = [1, 2, 3, 4]
for element in myList:
element *= 10
答案是「選項一」!
經過這些內容,相信大家對列表都有基本的認識了!
迭代也是一個很常見的用法,但是要特別注意迭代的對象是誰,因為這個影響很大。
下一篇來進一步介紹列表的相關方法。