字典(dictionary)
- 字典是Python內建的資料類型之一,在其他語言中稱為HashMap。
- 字典使用鍵:值(key:value)來進行存取,它定義了key與value之間一對一的關係。
- 字典與串列很像,可是字典不在乎項目的順序,而且不會使用位移值來選擇項目。
- 必須為每一個值都指定一個獨一無二的鍵
- 鍵的順序是任意排列的
- 字典通常是可變的,所以我們可以任意更改key/value
用{}
來建立字典
- 需要使用
{}
包住以,
分隔的key:value對。
>>> empty_dict = {}
>>> empty_dict
{}
>>> dict_animals = {"cat":2, "dog":3, "bird":6}
>>> dict_animals
{'cat': 2, 'dog': 3, 'bird': 6}
用dict()
將其他的資料類型轉換成字典
- 利用
dict()
函式,將雙值序列轉換到字典裡。
>>> lol_dict = [ ['a', 'b'], ['c', 'd'], ['e', 'f'] ]
>>> dict(lol_dict)
{'a': 'b', 'c': 'd', 'e': 'f'}
>>> lol_tuple = [ ('a', 'b'), ('c', 'd'), ('e', 'f') ]
>>> dict(lol_tuple)
{'a': 'b', 'c': 'd', 'e': 'f'}
>>> lol_string = ['ab', 'cd', 'ef']
>>> dict(lol_string)
{'a': 'b', 'c': 'd', 'e': 'f'}
每一個序列的第一個項目都會被當成key,第二個項目則被當成value
在字典裡,key的順序是任意排列的,會因為添加項目的方式不同而有所不同
用[key]
來添加或變更項目
- 這裡製作了一個小型團隊的字典,姓為key,名為value。
>>> Team = {
... 'Wu':'PP',
... 'Lee':'Annie'
... }
>>> Team
{'Wu': 'PP', 'Lee': 'Annie'}
- 新增成員
>>> Team['Feng'] = 'Peter'
>>> Team
{'Wu': 'PP', 'Lee': 'Annie', 'Feng': 'Peter'}
- 變更成員名字
>>> Team['Feng'] = 'King'
>>> Team
{'Wu': 'PP', 'Lee': 'Annie', 'Feng': 'King'}
此處是利用key來改變值
使用update()
合併字典
>>> others = {
... 'Chen':'Sandy',
... 'Pan':'Ethan'}
>>> others
{'Chen': 'Sandy', 'Pan': 'Ethan'}
>>> Team.update(others)
>>> Team
{'Wu': 'PP', 'Lee': 'Annie', 'Feng': 'King', 'Chen': 'Sandy', 'Pan': 'Ethan'}
用[key]
來取得一個項目
>>> Team['Wu']
'PP'
>>> Team['Kao']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Kao'
使用keys()
取得所有key、values()
取得所有value、items()
取得所有key&value
>>> Team.keys()
dict_keys(['Wu', 'Lee', 'Feng', 'Chen', 'Pan'])
>>> list (Team.keys())
['Wu', 'Lee', 'Feng', 'Chen', 'Pan']
>>> Team.values()
dict_values(['PP', 'Annie', 'King', 'Sandy', 'Ethan'])
>>> list (Team.values())
['PP', 'Annie', 'King', 'Sandy', 'Ethan']
>>> Team.items()
dict_items([('Wu', 'PP'), ('Lee', 'Annie'), ('Feng', 'King'), ('Chen', 'Sandy'), ('Pan', 'Ethan')])
>>> list (Team.items())
[('Wu', 'PP'), ('Lee', 'Annie'), ('Feng', 'King'), ('Chen', 'Sandy'), ('Pan', 'Ethan')]
使用list()
來將key & value轉換成串列
需要注意的是,items()
的key & value會以tuple的形式回傳
使用in
來測試字典內是否有某個key
>>> 'Lee' in Team
True
>>> 'Kao' in Team
False
用=
來指派,用copy()
來複製
>>> save_Team = Team
>>> Team['Chung'] = 'Farter'
>>> Team
{'Wu': 'PP', 'Lee': 'Annie', 'Feng': 'King', 'Chen': 'Sandy', 'Pan': 'Ethan', 'Chung': 'Farter'}
>>> save_Team
{'Wu': 'PP', 'Lee': 'Annie', 'Feng': 'King', 'Chen': 'Sandy', 'Pan': 'Ethan', 'Chung': 'Farter'}
更改字典時,結果會反映在所有參考它的名稱上
>>> ori_Team = Team.copy()
>>> Team['Xie'] = 'Shin'
>>> Team
{'Wu': 'PP', 'Lee': 'Annie', 'Feng': 'King', 'Chen': 'Sandy', 'Pan': 'Ethan', 'Chung': 'Farter', 'Xie': 'Shin'}
>>> ori_Team
{'Wu': 'PP', 'Lee': 'Annie', 'Feng': 'King', 'Chen': 'Sandy', 'Pan': 'Ethan', 'Chung': 'Farter'}
若要避免此種情形發生,可以使用copy()
dict v.s. list
- dict的查詢與插入速度較快,不會隨著key的增加而變慢; list的查詢與插入時間會隨著元素的增加而增加
- dict需要佔用較多記憶體; list則佔用較少記憶體
集合(set)
- set就像是被移除value,只留下key的dict
- set是沒有重複元素的無序集合
- 現在我該使用set還是dict呢?
- 只想要知道某個東西存在與否,不在乎其它的 => set
- 我全都要,而且我還想要將資訊指派給key => dict
以set()
建立集合
>>> empty_set = set()
>>> empty_set
set()
>>> empty_dict = {}
>>> empty_dict
{}
>>> even = {0, 2, 4, 6}
>>> even
{0, 2, 4, 6}
>>> odd = {1, 3, 5, 7}
>>> odd
{1, 3, 5, 7}
[]
會建立空的list,{}
會建立空的dict,然而空的集合需要使用set()
來建立。
在Python中,dict會優先取用{}
用set()
將其他的資料類型轉換成集合
- 字串轉換成集合
>>> set( 'letters' )
{'e', 'r', 's', 't', 'l'}
set()
會將重複的元素移除,並形成無序的集合
- list轉換成集合
>>> set( ['aa', 'bb', 'cc'] )
{'bb', 'aa', 'cc'}
- tuple轉換成集合
>>> set ( ('aa', 'bb', 'cc') )
{'bb', 'aa', 'cc'}
使用in
來測試集合內是否有值
>>> home = {'Annie', 'Philip', 'Kiki', 'Lele'}
>>> home
{'Kiki', 'Philip', 'Annie', 'Lele'}
>>> 'Philip' in home
True
>>> 'Kitty' in home
False
集合運算子
>>> a = {1,2}
>>> b = {2,3}
- a&b: 交集
>>> a & b
{2}
- a|b: 聯集
>>> a | b
{1, 2, 3}
- a-b: 差集
>>> a - b
{1}
比較資料結構
()
、[]
、{}
。[]
orlist()
: 製作串列(,)
製作tuple- 可為這兩種形式 =>
'a','b'
or('a','b')
- 可為這兩種形式 =>
{key:value}
製作字典