Skip to content

[Python] 基本教學(11) Tuples, Sets, Dictionary

Python 中其實有著各式各樣的資料型態,很難一一舉例窮盡存在於 Python 中的所有資料型態。

所以今天,我就簡單地介紹一下 Python 中我們常用的那些資料型態吧?

tuple,其實跟 list 很像,同樣是我們可以將不同的資料型態的值全部匯集在一起存入一個變數。不過 tuple 不能新增、刪除、甚至更新我們 tuple 內的值。

set 同樣地跟 list 很像,但最明顯的差別便是 set 不會存在同樣的兩個值。

dictionary 可說是相當方便的一種資料型態,在 Python 中也被稱呼為 dict。其資料存取的模式就像是 key-value 對應的模式一樣,一個 key 對應著一個 value,我們可以藉此存取有用的資訊、或是對資料進行不同的分析。


Tuple

首先,我們便先從 tuple 開始吧!

a = (1, 2, 2, 3, 3, 3, 'a', 'b', 'c', 'c')
print(a.count(2))
print(a.count(3))
print(a.index(1))
print(a.index('a'))


a 這種變數的宣告方法是我們將資料存入 tuple 的一種模式,之後也沒辦法再做其他更新了。

a.count(n) 可以計算我們 tuple 中包含多少『n』這個元素。
a.index(n) 可以計算我們 tuple 中『n』出現的位置,也就是計算其在 tuple 中的 index。

Output:

2
3
0
6

2: 我們可以輕易地發現:2 在 tuple 中出現過兩次。
3: 我們也可以輕易地發現:3 在 tuple 中出現過三次。
0: 這裡代表的是 1 的 index,1 是 tuple 的第一個值,故 index 為 0 是相當合理的。
6: 在這裡敗表的是 “a” 的值,大家可以算算看 index 是不是真的為 6。


Set

關於講解 set,其實我個人是非常心虛的。哈哈哈。

在此之前,我從來都沒有好好使用過 set 這個資料型態,唯一會派上用場的機會,便是將 list 裡面重複出現的值刪掉。(這真的很好用!)

a = set(a)
b = set([1, 3, 5, 'a', 'c', 'e'])

print(a)
print(b)


Output:

{'c', 1, 2, 3, 'b', 'a'}
{1, 3, 5, 'a', 'e', 'c'}

請原諒我的懶惰,我直接將上一組介紹的 tuple 直接轉成 set 資料型態啦 XD

你可以看到,那些重複的值通通被刪除了。

另外若你把資料打印出來,你會看到其實不同的資料型態,他們所使用的括號也有所差別。

那麼,以下開始介紹 set 會使用到的功能吧!

c = a.copy()
print(c)


copy 的指令其實 list 也有,可以將我們的資料直接賦予另外一個變數(在這裡便是複製給 c)。

要注意的是,若不是用 copy 指令而是直接賦值給其他變數,常常發生兩者指標共同指向同一個記憶體位置!這樣會導致我們修改了其中一個變數,另一個變數也跟著改變的窘境。

許多 Python 程式的 Bug 也都是由此而來。

c = a.copy()
print(c)

c.clear()
print(c)


Output:

{1, 2, 3, 'b', 'a', 'c'}
set()

首先我們可以看到,第一次經由 a.copy() 複製而來的變數 c,經印出後便是 a 裡面所含有著的數值。
而第二次,我們對 c 執行了 clear() 這個指令,這會清空整個 set!就像下方印出的一樣,整個 set 裡面沒有任何值!大家也要小心不要誤刪資料哦!

set 的資料當然也可以如同『線性代數』裡面所教的 set 一般,進行簡單的『交集』、『聯集』、『差集』…… 等等的計算,我們首先便用 a, b 兩組 set 示範一下!

print(a)
print(b)
print('交集:', a.intersection(b))
print('聯集:', a.union(b))
print('差集:', a.difference(b))


Output:

{'c', 1, 2, 3, 'b', 'a'}
{1, 3, 5, 'a', 'e', 'c'}
交集: {'c', 1, 3, 'a'}
聯集: {'c', 1, 2, 3, 5, 'e', 'b', 'a'}
差集: {'b', 2}

我們可以看得出來以上的指令真的可以計算出這些特性!

另外,值得一提的是 set 的增加與刪除。其可以簡單地使用 add() 和 remove() 來做到。

c.clear()
c.add(1)
c.add(2)
print(c)

c.remove(1)
print(c)


Output:

{1, 2}
{2}

我們可以簡單地發現: 使用 add() 可以替 set 增加元素、使用 remove() 可以將 set 裡的元素刪除。


Dictionary

最後,終於來到介紹 dictionary 的地方啦!不過我認為這個資料型態的意義在於實做的部份,若是僅止於我的教學是沒辦法道盡這個資料型態的精華的!

在此請讓我多嘴一下。dictionary 可以拿來做統計(雖然這好像不是它的主要功能,畢竟 Python 其實就內建了 collections 這個 package 可以做到『統計』這件事)。但若與 Json 這種資料儲存的格式結合,你的資料會非常好管理!

當然我這樣子的說明是沒辦法讓人聽明白的,我的錯,dictionary 的好用就交給各位有幸讀到這篇文章的人去慢慢研究了。以下我將會介紹該怎麼使用 dict 這個 Python 內的資料型態,以及該怎麼對於這種資料型態儲存著的資料進行操作。

基本上,dict 的賦值可以分成兩種類型:第一種便是直接在宣告變數時直接給予、另一種便是之後再給予 key-value。

a = dict({1: 2, 2:4, 3:6})
print(a[1])
print(a[2])
print(a[3])


Output:

2
4
6

我們宣告變數 a 為 dictionary 的資料型態,並在一開始便把我們的 key-value 賦值給這個變數。

我們可以看到 key 都是數字, value 都是我們 key 的兩倍。

那麼,我們試試看先宣告變數,然後再賦值給這個變數。

b = dict()

b[1] = 2
b[2] = 4
b[3] = 6

print(b[1])
print(b[2])
print(b[3])


Output:

2
4
6

中間 b[n] = m 的部份便是在賦值 key-value。

如何?這樣一看是不是一模一樣呢?

dict 同樣具有 clear()、copy() 等指令,可以參考之前 set 的說明。

print(a.items())
print(a.keys())
print(a.values())


Output:

dict_items([(1, 2), (2, 4), (3, 6)])
dict_keys([1, 2, 3])
dict_values([2, 4, 6])

查看資料的方法除了直接將其整個 dictionary print 出來之外,我們還可以透過 items()keys()values() 來查看資料的模樣。

items(): 會將資料以包含 key-value 的樣子印出
keys(): 只會印出 dictionary key 值的部份
values(): 只會印出 dictionary value 值的部份

除此之外,跟大家介紹一個統計的好方法!

text = 'This is a very big and red apple.'
statistic = {}

for word in text:
    statistic[word] = statistic.get(word,0) + 1

for key in statistic:
    print(key, statistic[key])


Output:

T 1
h 1
i 3
s 2
  7
a 3
v 1
e 3
r 2
y 1
b 1
g 1
n 1
d 2
p 2
l 1
. 1

首先,我們先定義了我們要統計字母數的文本。
然後,我們將 statistic 這個變數宣告為 dict 資料型態,目前是空值。

使用 for-loop 呼叫出文本 text 中所有的字母,然後,我們使用 get() 的特性來進行統計。

get(n, m) 亦為查看 dict 資料的一種方式,其可以將 dict 當中 key 為 n 的值返回;若是 key 當中並不存在著 n 這個 key 值,那麼便返回我們設定的 m。(預設是 None)

如此一來我們便可以統計字母數量了:如果這個字母在 dictionary 裡頭已經有了,我們便返回它目前的數量並再 +1;如果目前這個字母還沒有被統計過,那麼我們就初始化這個 key 為 0,然後再 +1。

最後,我們同樣利用 for-loop 迭代整個 dict,印出 key 以及 value。

是不是很巧妙呢?

對了,大家應該看到了目前我們印出的 key-value,顯然我們是沒有經過排序的。也許大家可以思考看看:該怎麼讓這些數值排序印出呢?

大家可以挑戰看看!


References


Read More

Leave a Reply