Python Dict 介紹
Dict 在 Python 語言中又稱為 associated array
基本上 Dict instance 大括號包起來便是, 需注意的是,Set 資料結構也可以以大括號呈現。
但中 空大括號型別預設為 Dict
允許放入不同型別的元素,
但,若不同型別在迴圈與 Comprehension 走訪時需注意可能出錯。另外,以中括號取值的操作:
list 的 slice 操作,ex: list[1:2]
dict 的 get 操作,ex: dict['key']
1
2dict1 = {}
3print(type(dict1))
4# <class 'dict'>
5
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
2basic_dict1 = {}
3print(type(basic_dict1))
4# <class 'dict'>
5basic_dict2 = {'k': 'v', 1: 30}
6print(basic_dict2)
7# {'k': 'v', 1: 30}
8# then use square quotes to add/get item
9
Dict 建構: dict()
- 懷疑人生的 dict function 建構法: 多個 overloaded dict()
equal style,比較容易混亂 ,我傾向忘了他
左側為 key,自動轉 String,不可加 single quote。
右測為 value,採通用規矩。
1
2dict_equale = dict(k=1, k2=2)
3# {'k': 1, 'k2': 2}
4# 注意 k -> 'k'
5
Dict 建構: dict() with tuple
tuple2 list style1,直接傳入 tuple2 的 sequence
dict function 接受 tuple2 sequence,所以衍生出後續其他變形
1
2dict_tuples = dict([['key1', 'v1'], ['key2', 'v2']])
3dict_tuples = dict([('key1', 'v1'), ('key2', 'v2')]) # 同於上方範例
4# {'key1': 'v1', 'key2': 'v2'}
5
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
2print(type(basic_dict2.items()))
3# <class 'dict_items'>
4dict_unpack = dict(basic_dict2.items())
5# {'k': 'v', 1: 30}
6
Dict 建構: zip()
tuple2 list style3,變形B: zip fucntion
zip style,zip 方式也是 tuple2 sequence 的變形。
zip function 可以將兩個 lists 依順序依次組合成 tuple2。
所以 zip function 就是一個建構 tuple2 sequence 的工具。
1
2keys = ('a1', 'a2', 'a3')
3values = ('v1', 'v2') # 故意給不同長度測試
4zip_seq = zip(keys, values)
5print(type(zip_seq))
6# <class 'zip'>
7dict_zip = dict(zip_seq)
8print(dict_zip)
9# {'a1': 'v1', 'a2': 'v2'}
10# zip 無法組合部分會被捨棄
11
Dict 建構: 以 dict.fromkeys() 給予預設值
dict_fromKeys style 建立有預設值的 dict
這邊是使用 class dict 的 fromkeys 類別方法
依指定的 keys 來生出有預設的 dict
1
2deafult_value = 0
3dict_fromKeys = dict.fromkeys(('k1','k2','k3','k4'), deafult_value)
4# {'k1': 0, 'k2': 0, 'k3': 0, 'k4': 0}
5
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
2from collections import defaultdict
3scores = defaultdict(int)
4print(scores) # defaultdict(<class 'int'>, {})
5print(scores.items()) # dict_items([])
6scores['Totem'] # 此處已據 type 設定給予預設值: 0
7scores['Winnie'] = 90
8print(scores.items()) # dict_items([('Totem', 0), ('Winnie', 90)])
9
自訂預設型別
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#
3map1 = dict(zip(('a','b','c'), ('A','B','C')))
4getValue = map1['a']
5print(getValue)
6# A
7#
8#
9getValues = map1.values()
10print(getValues)
11# dict_values(['A', 'B', 'C'])
12print(type(getValues))
13# <class 'dict_values'>
14for v in getValues:
15 print(v)
16getKeys = map1.keys()
17print(getKeys)
18#
19#
20# dict_keys(['a', 'b', 'c'])
21print(type(getKeys))
22# <class 'dict_keys'>
23for k in getKeys:
24 print(k)
25getItems = map1.items()
26print(getItems)
27#
28#
29# dict_items([('a', 'A'), ('b', 'B'), ('c', 'C')])
30print(type(getItems))
31# <class 'dict_items'>
32for k, v in getItems:
33 print(k + ':' + v)
34# a:A
35# b:B
36# c:C
37