Python 入門 4 | 資料結構

speaker-image

劉晉嘉

資工系二年級

  • GDG on Campus NTPU 核心幹部 技術組成員
  • 擅長撰寫 C++

講座內容摘要

一、列表 (List)

1. 列表的特色

  • 又稱為串列、清單。
  • 有序性:列表中的元素是有序的,並且可以通過索引值查找之。
  • 異構性:列表可同時包含不同類型的元素,例如數字、字符串、列表等。
  • 可變性:列表中的元素可以被修改、添加或刪除。
  • 動態長度:列表的大小是可變的,可以根據需要動態調整。

2. 基本操作

(1) 創建列表:使用中括號 [] 創建列表。

fruits = ["apple", "banana", "cherry"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "apple", 3.14, True]

(2) 查找元素:可透過索引值查找列表中的元素(索引值從 0 開始)。

# 承上

print(fruits[0])         # 輸出: apple
print(numbers[2])        # 輸出: 3

(3) 修改元素:可透過索引值直接修改列表中的元素(效果相當於覆蓋)。

# 承上

fruits[1] = "blueberry"  # banana 會被 blueberry 取代
print(fruits)            # 輸出: ['apple', 'blueberry', 'cherry']

(4) 添加元素:使用 .append() 方法將元素添加到列表末端。

# 承上

fruits.append("orange")
print(fruits)            # 輸出: ['apple', 'blueberry', 'cherry', 'orange']

(5) 刪除元素:使用 .remove() 方法刪除指定的元素資料,或使用 .pop() 方法刪除指定索引值的元素。

# 承上

fruits.remove("blueberry")
print(fruits)  # 輸出: ['apple', 'cherry', 'orange']
fruits.pop(1)
print(fruits)  # 輸出: ['apple', 'orange']

(6) 列表長度:使用 len() 函式,可獲取列表的長度(以元素個數計算)。

# 承上
# 此時的 fruits = ['apple', 'orange']

print(len(fruits))  # 輸出: 2

二、元組 (Tuple)(不可變的 List )

1. 元組的特色

  • 有序性:與列表相同,元組中的元素是有序的,且可透過索引值查找之。
  • 異構性:與列表相同,元組也可以同時包含不同類型的元素。
  • 不可變性:與列表不同,元組中的元素一旦創建就不能修改或增減(故元組可以保證數據的完整性,較適用於儲存不需要修改的數據,例如坐標、顏色值等)。
  • 高效性:由於不可變,元組的操作速度通常比列表更快。

2. 基本操作

(1) 創建元組:可以直接使用逗號分隔元素,或使用小括號 () 創建元組。

coordinates = 10, 20
person = ("John", 30, "Engineer")

(2) 查找元素:可透過索引值查找元組中的元素(索引值從 0 開始)。

# 承上

print(coordinates[0])    # 輸出: 10
print(person[2])         # 輸出: Engineer

(3) 不可變性:元組中的元素是不可變的,不能修改。

# 承上

coordinates[0] = 15      # 無法將索引值 0 的 10 改為 15 -> 程式會報錯

三、集合 (Set)(不重複的 List )

1. 集合的特色

  • 無序性:與列表、元組不同,集合中的元素是無序的,不會按照添加順序排列,故無法透過索引值查詢特定元素。
  • 可變性:集合本身是可變的,可以在集合內添加或刪除元素,但集合中的元素必須是不可變的類型(如數字、字串)。
  • 唯一性:集合中的元素是唯一的,重複添加的元素會被自動去除(因此可以用集合來去除列表中的重複元素,也可用以快速檢查某個元素是否在此集合中)。
  • 集合操作:可以進行集合的交集、聯集和差集等操作。

2. 基本操作

(1) 創建集合:使用大括號 {} 創建集合。

fruits\_set = {"apple", "banana", "cherry"}
numbers\_set = {1, 2, 3, 4, 5}

(2) 添加元素:使用 .add() 方法添加元素到集合中。

# 承上

fruits\_set.add("orange")
print(fruits\_set)  # 輸出: {'apple', 'banana', 'orange', 'cherry'}(無序)

(3) 刪除元素:使用 .remove() 方法刪除指定元素。

# 承上

fruits\_set.remove("banana")
print(fruits\_set)  # 輸出: {'cherry', 'apple', 'orange'}(無序)

(4) 集合比較:

  • 子集合(又稱部分集合)與超集合:當一個集合的所有元素都包含在另一個集合中,則小集合為大集合的「子集合」(subset)、大集合為小集合的「超集合」(superset)。
# 子集合與超集合

a = {1, 2, 3, 4, 5}
b = {1, 2, 3}
print(b.issubset(a))    # 即「b 是否為 a 的子集合」。輸出: True
print(a.issuperset(b))  # 即「a 是否為 b 的超集合」。輸出: True
# 集合的比較
# 承上

c = {1, 3, 2}
print(b == c)          # 因為集合中的元素沒有順序性,故會輸出: True
print(b != c)          # 輸出: False

(5) 集合操作:

  • 交集:使用 & 或 .intersection() 方法,會建立一個新集合,包含 a、b 集合的共同元素。
a = {1, 6, 8, 10, 20}
b = {1, 3, 8, 10}

print(a & b)                # 輸出: {1, 8, 10}
print(a.intersection(b))    # 輸出: {1, 8, 10}
  • 聯集:使用 | 或 .union() 方法,會建立一個新集合,包含集合a、b 中所有的元素(不重複)。
# 承上

print(a | b)                 # 輸出: {1, 3, 6, 8, 10, 20}
print(a.union(b))            # 輸出: {1, 3, 6, 8, 10, 20}
# 過程:先加入 a 集合的所有元素,再加入 b 集合中 a 集合沒有的元素。
  • 差集:使用 - 或 .difference() 方法,會建立一個新的集合,以下面程式碼為例,它將包含只在 a 集合中但不在 b 集合中的元素。
# 承上

print(a - b)                 # 輸出: {20, 6}
print(a.difference(b))       # 輸出: {20, 6}
# 過程:建立一個跟 a 集合相同的新集合,並將它去掉與 b 集合的共同元素。
  • 對稱差集:使用 ^ 或 .symmetric_difference() 方法,會建立一個新集合,包含「只存在於 a或 b 集合中,但並非兩者共同存在」的元素。
# 承上

print(a ^ b)                       # 輸出: {3, 6, 20}
print(a.symmetric\_difference(b))   # 輸出: {3, 6, 20}
# 過程:建立一個新集合,包含 a、b 集合的所有元素(即聯集),然後再去掉兩者的共同元素。

四、字典 (Dictionary)(有標題的 List )

1. 字典的特色

  • 鍵值對:字典是由鍵值對組成的,每個鍵(key)對應一個值(value),適合儲存有對應關係的數據,例如用戶資訊、配置參數等,而由於字典在查詢上是透過「雜湊表(hash table)」實現的,因此查找效率也很高。
  • 有序性:從 Python 3.6 開始,字典從無序改為有序。
  • 可變性:字典是可變的,可以修改、添加或刪除鍵值對。
  • 唯一性:字典中的每個鍵是唯一的,一個鍵只能對應一個值,但多個鍵可以對應相同的值。
# 當新增一個鍵已存在的鍵值對,其值最終會被新值覆蓋

letters = {'a': 1, 'b': 2, 'a': 3}  # 鍵 'a' 重複,最終值會被覆蓋為 3
print(letters)                      # 輸出:{'a': 3, 'b': 2}

2. 基本操作

(1) 創建字典:使用大括號 {key:value} 語法創建字典。

country2Continent = {'Taiwan': 'Asia', 'Germany': 'Europe', '阿拉伯聯合大公國' : '亞洲'}

(2) 查找元素:通過鍵查找字典中的值。

# 承上

print(country2Continent['Taiwan'])           # 輸出:Asia
print(country2Continent['Germany'])          # 輸出:Europe
print(country2Continent['阿拉伯聯合大公國'])    # 輸出:亞洲

(3) 添加或修改元素:直接通過鍵賦值。

# 承上

country2Continent['阿拉伯聯合大公國'] = 'Asia'
print(country2Continent)
# 輸出:{'Taiwan': 'Asia', 'Germany': 'Europe', '阿拉伯聯合大公國': 'Asia'}
country2Continent['Turkey'] = 'Asia'
print(country2Continent)
# 輸出:{'Taiwan': 'Asia', 'Germany': 'Europe', '阿拉伯聯合大公國': 'Asia', 'Turkey': 'Asia'}

(4) 刪除元素:使用 del 關鍵字刪除指定鍵值對。

# 承上
# 範例:將「Turkey」國家名稱改為原文

del country2Continent['Turkey']
print(country2Continent)
# 輸出:{'Taiwan': 'Asia', 'Germany': 'Europe', '阿拉伯聯合大公國': 'Asia'}
country2Continent['Türkiye'] = 'Asia'
print(country2Continent)
# 輸出:{'Taiwan': 'Asia', 'Germany': 'Europe', '阿拉伯聯合大公國': 'Asia', 'Türkiye': 'Asia'}

辛苦啦~ 恭喜你完成了第四個【資料結構】學習單元!