Python 程式設計

第 11 章    串列與字組

(1) 串列簡介

∗ 串列 (List)

▸ 串列是一串 Python 的資料

▸ 串列的產生:將元素包在方括號裡,例如:

numbers = [10, 20, 30, 40]
weekdays = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'] 
aList = [10, 'Hello', 3.1415926]
emptyList = []    # 空串列  

▸ 串列裡的項目稱為元素 (Element),各個元素可以有不同的資料型態

▸ 元素也可以是另一個串列,此種串列稱為「巢狀」串列 (Nested list),例如:

nestedList = [10, 'Hello', 20.5, [30, 40]]

▸ 串列長度:最上層的元素數量

numbers = [10, 20, [30, 40, 50]]
print(len(numbers))
3

(2) 存取串列中的元素

∗ 利用索引方式取出串列元素

numbers = [10, 20, [30, 40, 50]]
print(numbers[1])
print(numbers[2])
print(numbers[2][2])
20
[30, 40, 50]
50

∗ 利用布林運算子 in 判斷是否是成員

fruits = ['apple', 'orange', 'banana']
print('apple' in fruits)
print('watermelon' in fruits)
print('orange' not in fruits)
True
False
False

∗ 串連 (+) 與重複 (*)

fruits = ['apple', 'orange', 'banana']
print(fruits + [6, 7, 8, 9])
print([0]*4)
['apple', 'orange', 'banana', 6, 7, 8, 9]
[0, 0, 0, 0]

∗ 切片 (slice)

aList = [1, 2, 3, 4, 5, 6]
print(aList[1:3])    # 第 1 到第 2 個
print(aList[:4])     # 第 0 到第 3 個
print(aList[3:])     # 第 3 個到最後
print(aList[:])      # 全部
[2, 3]
[1, 2, 3, 4]
[4, 5, 6]
[1, 2, 3, 4, 5, 6]

∗ 串列內容是可改變的 (Mutable)

fruits = ['apple', 'orange', 'banana']
fruits[0] = 'watermelon'       # 改變第一個元素
fruits[-1] = 'pineapple'    # 改變最後一個元素
print(fruits)

aList = [1, 2, 3, 4, 5, 6] 
aList[1:3] = [10, 20]    # 改變第 1 到 2 個元素
print(aList)
aList[1:3] = []    # 刪除第 1 到 2 個元素
print(aList)
['watermelon', 'orange', 'pineapple']
[1, 10, 20, 4, 5, 6]
[1, 4, 5, 6]

∗ 刪除元素或串列:del

aList = [1, 2, 3, 4, 5, 6] 
del aList[1]    # 刪除第 1 個元素
print(aList)

del aList[1:3]  # 刪除第 1 到 2 個元素
print(aList)

del aList       # 刪除整個串列
print(aList)
[1, 3, 4, 5, 6]
[1, 5, 6]
NameError: name 'aList' is not defined

(3) 串列方法

∗ 內建串列方法

▸ 語法: <theList>.<method>,例如:

a = [4, 2, 3, 1]
a.sort()    # [1, 2, 3, 4]
方法說明
.append(<item>)在串列後端加入 <item> 項目
.insert(<position>, <item>)在 <position> 位置插入 <item> 項目
.pop()刪除並回覆串列的最後項目
.pop(<position>)刪除並回覆串列在 <position> 位置的項目
.sort()排序
.reverse()反向排序
.index(<item>)回覆 <item> 項目第一次出現的位置
.count(<item>)回覆 <item> 項目出現的次數
.remove(<item>)刪除第一次出現的 <item> 項目

myList = []
myList.append(5)    # 附加
myList.append(27)
myList.append(3)
myList.append(12)
print(myList)
[5, 27, 3, 12]

myList.insert(1, 12)    # 在位置 1 插入項目
print(myList)
print(myList.count(12))    # 12 出現的次數
[5, 12, 27, 3, 12]
2

print(myList.index(3))    # 3 的位置
print(myList.count(5))    # 5 出現的次數
3
1

myList.reverse()    # 反向
print(myList)
[12, 3, 27, 12, 5]

myList.sort()    #  排序
print(myList)
[3, 5, 12, 12, 27]

myList.remove(12)  # 刪除第一個 12
print(myList)
[3, 5, 12, 27]

lastItem = myList.pop()  # 刪除並回覆最後一個項目
print(lastItem)
print(myList)
27
[3, 5, 12]

∗ 範例:產生一副撲克牌

▸ 構想:

✶ 花色 (Suite):4 (Spade,黑桃),3 (Heart,紅心),2 (Diamond,方塊),1 (Club,梅花)
✶ 數字 (Rank):2 ~ 14 (11: Jack, 12: Queen, 13: King, 14: Ace)
✶ 整副牌:402 ~ 414, 302 ~ 314, 202 ~ 214, 102 ~ 114
ch11/cards.py
import random

cards = []
for suite in range(1, 5):
    for rank in range(2, 15):
        cards.append(suite*100 + rank)

print(cards)

▸ 練習 1

∗ 將字串分解成為串列:split()

▸ 例如:

sentence = 'I love python'
words = sentence.split()      # 預設以空白為分隔符 (Delimiter)
print(words)

sentence = 'random,access,memory'
words = sentence.split(',')   # 以 ',' 為分隔符
print(words)
['I', 'love', 'python']
['random', 'access', 'memory']

(4) 以巢狀迴圈處理多維串列

∗ 一維串列 (One dimensional list)

▸ 例如:aList = [1, 3, 5, 7, 9]

∗ 二維串列 (Two dimensional list)

▸ 例如:

anArray = [
    [1, 3, 5, 7, 9],
    [2, 4, 6, 8, 10],
    [1, 4, 7],
    [2, 5, 8],
]

∗ 註:Python 二維串列的寫法有以下幾種:

▸ 排成一列

anArray = [[1, 3, 5], [2, 4, 6]]

▸ 依項目對齊

anArray = [[1, 3, 5],
           [2, 4, 6]]

▸ 依縮排對齊,結束符號在最後

anArray = [
    [1, 3, 5],
    [2, 4, 6]]

▸ 依縮排對齊,結束符號在新行最左,且最後一個項目保留逗點,以方便在下一行增加項目

anArray = [
    [1, 3, 5],
    [2, 4, 6],
]

∗ 巢狀迴圈 (Nested loop)

▸ 巢狀迴圈:兩個以上層層包疊的迴圈

for <sequence1> in <sequence2>:
    for <variable> in <sequence1>:
        <body>

▸ 範例:利用巢狀迴圈列印家庭成員,外層迴圈列印家庭,內層迴圈列印成員

ch11/families.py
families = [
    ['陳先生', '陳太太', '陳小弟'],
    ['李先生', '李太太', '李小妹'],
    ['劉先生', '劉太太'],
    ['張先生', '張小弟', '張大妹', '張小妹'],
]

for i, family in enumerate(families):
    print(f'{i}. 成員:', end='')
    for i, member in enumerate(family):
        print(member, end=', ')
    print()
陳家成員:陳先生, 陳太太, 陳小弟
李家成員:李先生, 李太太, 李小妹
劉家成員:劉先生, 劉太太

(5) 字組 (Tuple)

∗ 字組 (Tuple) 與串列類似,但不可改變 (Immutable)

▸ 習慣上以小括號包住 (也可以不用),例如:

words = ('red', 'blue', 'green') 
words = 'red', 'blue', 'green'

▸ 單一項目的字組需加上逗點,否則 Python 會視括號為一般運算符號

thisIsTuple = (5, )    # 一個字組,內含一個元素 5
thisIsumber = (5)      # 數字 5

∗ 字組指派 (Tuple assignment)

▸ 可一次指派多個變數 (左右數量需相同):

employee = ('Julia', 'Roberts', 1967, 'Taichung')
(firstName, lastName, birthYear, cityLivingIn) = employee    # 指派給 4 個變數
print(firstName)
print(lastName)
print(birthYear)
print(cityLivingIn)
Julia
Roberts
1967
Taichung

▸ 換值 (Swapping)

a = 3
b = 5
a, b = b, a
print(a, b)
5 3

▸ 練習 2