Skip to main content

Python Dict 介紹

Dict 在 Python 語言中又稱為 associated array

基本上 Dict instance 大括號包起來便是, 需注意的是,Set 資料結構也可以以大括號呈現。
但中 空大括號型別預設為 Dict
允許放入不同型別的元素,
但,若不同型別在迴圈與 Comprehension 走訪時需注意可能出錯。

另外,以中括號取值的操作:

list 的 slice 操作,ex: list[1:2]
dict 的 get 操作,ex: dict['key']

1 2 3 4 5 dict1 = {} print(type(dict1)) # <class 'dict'>

Dict 重點摘要

  • 空大括號預設為創建 dict,ex: dict1 = { }
  • put 以中括號賦值,ex: dict1['new_key']='new_value'
  • get 以中括號取值,ex: fetch = dict1['k']
  • values() 取全部值。
  • keys() 取全部 keys。
  • items() 取全部 key-value pairs。

Python Dict 建構方式

因為是筆記所以紀錄下合語法的建構方式,
別為難自己,記住最簡單的就好。
看完下面範例,絕對讓你懷疑人生。

  • Dict 基本建立方式
1 2 3 4 5 6 7 8 9 basic_dict1 = {} print(type(basic_dict1)) # <class 'dict'> basic_dict2 = {'k': 'v', 1: 30} print(basic_dict2) # {'k': 'v', 1: 30} # then use square quotes to add/get item

Dict 建構: dict()

  • 懷疑人生的 dict function 建構法: 多個 overloaded dict()

equal style,比較容易混亂 ,我傾向忘了他

左側為 key,自動轉 String,不可加 single quote。
右測為 value,採通用規矩。

1 2 3 4 5 dict_equale = dict(k=1, k2=2) # {'k': 1, 'k2': 2} # 注意 k -> 'k'

Dict 建構: dict() with tuple

tuple2 list style1,直接傳入 tuple2 的 sequence

dict function 接受 tuple2 sequence,所以衍生出後續其他變形

1 2 3 4 5 dict_tuples = dict([['key1', 'v1'], ['key2', 'v2']]) dict_tuples = dict([('key1', 'v1'), ('key2', 'v2')]) # 同於上方範例 # {'key1': 'v1', 'key2': 'v2'}

Dict 建構: dict() with dict_items

tuple2 list style2,變形A: \<class 'dict_items'>

tuple list style,直接傳入 tuple2 的 sequence。
所以這邊可以利用 dict.values 得到二元素的 list ie: \<class 'dict_items'>
再利用此特性複製或建構一個新的 dict。

1 2 3 4 5 6 print(type(basic_dict2.items())) # <class 'dict_items'> dict_unpack = dict(basic_dict2.items()) # {'k': 'v', 1: 30}

Dict 建構: zip()

tuple2 list style3,變形B: zip fucntion

zip style,zip 方式也是 tuple2 sequence 的變形。
zip function 可以將兩個 lists 依順序依次組合成 tuple2。
所以 zip function 就是一個建構 tuple2 sequence 的工具。

1 2 3 4 5 6 7 8 9 10 11 keys = ('a1', 'a2', 'a3') values = ('v1', 'v2') # 故意給不同長度測試 zip_seq = zip(keys, values) print(type(zip_seq)) # <class 'zip'> dict_zip = dict(zip_seq) print(dict_zip) # {'a1': 'v1', 'a2': 'v2'} # zip 無法組合部分會被捨棄

Dict 建構: 以 dict.fromkeys() 給予預設值

dict_fromKeys style 建立有預設值的 dict

這邊是使用 class dict 的 fromkeys 類別方法
依指定的 keys 來生出有預設的 dict

1 2 3 4 5 deafult_value = 0 dict_fromKeys = dict.fromkeys(('k1','k2','k3','k4'), deafult_value) # {'k1': 0, 'k2': 0, 'k3': 0, 'k4': 0}

Dict 建構: 以 defaultdict 給予預設值

通常建立 dict 時需要先提供 key/value pairs,如上方所有建立 dict 的範例中顯示。
部分時候,若單只是想建立一個 dict 的空集合,等到需要時再給予資料。
此時就可以使用 defaultdict,先定義 dict 空殼,
並限制 value 的型別,帶需要時再逐一餵值。

使用情境:

產生一個有預設值的 value container
資料分群(類似 Google collection 下的 Multimap)

Syntax of defaultdict

  • value_type 可以是內建資料型別如 int/float/list/set/lambda... 等,也可以是自訂型別。
from collections import defaultdict

instance_var = defaultdict(value_type)

defaultdict examples

1 2 3 4 5 6 7 8 9 from collections import defaultdict scores = defaultdict(int) print(scores) # defaultdict(<class 'int'>, {}) print(scores.items()) # dict_items([]) scores['Totem'] # 此處已據 type 設定給予預設值: 0 scores['Winnie'] = 90 print(scores.items()) # dict_items([('Totem', 0), ('Winnie', 90)])

自訂預設型別

class ExamScore:
def __init__(self, test='midterm exam', score='60'):
self.test = test
self.score = score

def __repr__(self):
return '%s=%s' % (self.test, self.score)

exams = defaultdict(ExamScore)
exams['Totem'] = ExamScore('final exam', '80')
exams['Insect'] # 給予預設的 ExamScore
print(exams)
# defaultdict(<class '__main__.ExamScore'>, {'Totem': final exam=80, 'Insect': midterm exam=60})

資料分群

books = [('Totem', 'Java'), ('Maggot', 'Entomology'), ('Totem', 'Python')]
auth_book = defaultdict(list) # 以 list 來收相同 Author 的 books。
for author, book in books:
auth_book[author].append(book)

print(auth_book.items())
# dict_items([('Totem', ['Java', 'Python']), ('Maggot', ['Entomology'])])

Python Dict 操作

  • dict 取 value
  • dict 取全部 values
  • dict 取全部 keys
  • dict 取 items, \<class 'dict_items'> : python 的特殊功能,取出 dict 中的 pairs。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 # map1 = dict(zip(('a','b','c'), ('A','B','C'))) getValue = map1['a'] print(getValue) # A # # getValues = map1.values() print(getValues) # dict_values(['A', 'B', 'C']) print(type(getValues)) # <class 'dict_values'> for v in getValues: print(v) getKeys = map1.keys() print(getKeys) # # # dict_keys(['a', 'b', 'c']) print(type(getKeys)) # <class 'dict_keys'> for k in getKeys: print(k) getItems = map1.items() print(getItems) # # # dict_items([('a', 'A'), ('b', 'B'), ('c', 'C')]) print(type(getItems)) # <class 'dict_items'> for k, v in getItems: print(k + ':' + v) # a:A # b:B # c:C