Day03 : 字典、集合


字典(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}

比較資料結構

  • ()[]{}
    • [] or list(): 製作串列
    • (,) 製作tuple
      • 可為這兩種形式 => 'a','b' or ('a','b')
    • {key:value} 製作字典

Ref

#Python
藉由精通Python這本書,來讓自己重新認識Python。






Related Posts

前後端分離與 SPA

前後端分離與 SPA

Don’t break the Web:以 SmooshGate 以及 keygen 為例

Don’t break the Web:以 SmooshGate 以及 keygen 為例

Top issues on OWASP

Top issues on OWASP

Python Table Manners - 測試 (二)

Python Table Manners - 測試 (二)

從 JavaScript 踏入程式語言

從 JavaScript 踏入程式語言

Lidemy HTTP Challenge 破關紀錄

Lidemy HTTP Challenge 破關紀錄



Comments