Python 101 基礎教學 (8) - Collections:set、dictionary

這篇想要介紹另外兩個資料型態:set 與 dictionary。這兩個類型的存在與 list 比較,更具效能的優勢。用 set/dict 在查找資料時,大部分情況都是不需要做"掃描"的動作。

如果有個 list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ,你想要找出是否 list 裡包含 6 ,你需要做掃描(遍歷)的動作,意指你要從第一筆資料 1 開始查看,直到 6 的時候才能知道 6 存在於這個 list裡,但使用 set/dict 是不需要的。

你可能會問說有什麼好處?假設今天 list 裡面有 100 萬筆資料,那你在查找東西的時候就會遇到嚴重的效能問題。相比來說如果使用 set/dict,在這個資料量級裡取用資料還是相當有效率的。

集合 Set

set 是跟 list 不一樣的地方是,資料沒有順序。用 add 把資料存進去;用 remove 或是 discard 把資料移除;用 in 檢查元素是否存在於 set 裡。這裏個操作都是非常有效率的。

s = set() # 宣告空的 set

s.add(1)
s.add(2)
s.add(3)
print(s) # output: {1,2,3}

# discard
s.discard(1)
print(s) # output: {1, 2}
s.discard(4) # set裡面沒有4,什麼事都不會發生

# remove
s.remove(2)
print(s) # output: {1}
s.remove(4) # set裡面沒有4,報錯

# 初始宣告
s = {1, 2, 3}
print(s) # output: {1, 2, 3}

# 查找資料非常有效率
print(1 in s) # output: True
print(4 in s) # output: False

set 是 iterable,所以可以用 for loop去走訪,只是如上述所說,是無序的

st = 'abcde'
s = set(st) # 把 string 轉成 set

# 以下印出 b d c a e(順序無法保證)
for e in s:
    print(e)

字典 Dictionary

dict 跟 set 一樣都是一個很有效率的資料結構。字典 dict 的組成是以 key/value 的方式存取({ key1: value1, key2: value2 })。

# 宣告空字典(2種方法)
d = {}
d2 = dict()

d[1] = 2
print(d[1]) # output: 2
print(d) # output: {1:2}
print(1 in d) # output: True

d['yo'] = 'abc'
print(d['yo']) # output: 'abc'
print(d) # output: {1: 2, 'yo': 'abc'} 
print('yo' in d) # output: True

print(2 in d) # output: False
print(d[2]) # 報錯 KeyError

# 初始宣告
d = {1: 2, 3: 4}
print(d) # output: {1: 2, 3: 4}

在 python3.6 以前 dict 跟 set 一樣是沒有順序的如果要使用有順序的 dict 要另外import OrderedDict。但是python3.7以後因為實作方式的改變,走訪dict時會依照插入順序。

d = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}

# 以下印出keys:k1 k2 k3
for e in d:
    print(e)

# 以下印出keys與values: k1 v1 k2 v2 k3 v3
for k, v in d.items():
    print(k, v)
    
# 以下印出keys:k1 k2 k3
for k in d.keys():
    print(k)
    
# 以下印出values:v1 v2 v3
for v in d.values():
    print(v)
    
print(d.keys()) # output: dict_keys(['k1', 'k2', 'k3'])
print(d.values()) # output: dict_values(['v1', 'v2', 'v3'])

# d.keys()/d.values() 並不是list,但可以轉成list
print(list(d.keys())) # output: ['k1', 'k2', 'k3']
print(list(d.values())) # output: ['v1', 'v2', 'v3']

在程式語言裡,要提高你的程式效能,很多時候就是用空間換時間。如果要寫出高效程式,就必須熟用 set/dict。

繼續閱讀:

Python 101 基礎教學 (9) - 模組 module 與套件 package
寫程式從來就是站在巨人的肩膀上。Python 提供了許多的內建模組便利我們加速開發,事半功倍。除此之外你可以用第三方的函式庫,你也可以自己造輪子,寫自己的套件模組。
Huaying Tsai

Huaying Tsai

擅長 Python, Javascript, React, GraphQL。 想寫寫一些適合新手的程式語言教學文。 想推廣現代社會學習多元技能的風氣,建立了技能交換的平台 - https://thoth.tw
台灣