1. 程式人生 > >Python中避免在給多維陣列賦值之前判斷key是否存在的方法 • cenalulu's Tech Blog

Python中避免在給多維陣列賦值之前判斷key是否存在的方法 • cenalulu's Tech Blog

Python在使用二維及多維陣列(dict)時,每次賦值之前都需要判斷一維及較小維度上的key是否存在。本文將介紹對於這種問題的解決方案

背景

Python中可以使用dict資料型別來實現二維及多維陣列。但是在對dict型別的多維陣列賦值時,相較其他語言需要預先額外判斷一次低維度的key是否存在的操作。否則就會報KeyException(這種功能稱為Autovivification),具體見下例:

#初始化一個數組,對[1,1]這個點賦值為0
two_dimensional_dict = {1: {1: 0}}

#此時如果我們想要對[2,2]這個點也賦值為0
#那麼需要額外進行一次 if 2 in two_dimensional_dict的操作
#否則Python會raise KeyException #以下語句會報錯 two_dimensional_dict = {2: {2: 0}} #需要使用如下方式 if 2 in two_dimensional_dict: two_dimensional_dict = {2: {2: 0}} else: two_dimensional_dict{2} = {} two_dimensional_dict = {2: {2: 0}}

用colletions.defaultdict來實現二維陣列

作為一個類庫豐富的語言不應該接受有如此冗餘程式碼存在的場景。於是求助google,果然在

stackoverflow上有解答。具體的方法就是用collections.defaultdict來替代dict兩者的使用方法一致,除了前者在初始化時需要告知:當低維度key不存在時的default值。具體的使用方法如下:

from collections import defaultdict

#建立一個二維陣列
#如果低維度key未初始化時的預設值是0
my_dict = defaultdict(defaultdict)
my_dict[1][1] += 1
#output: 1
print my_dict[1][1]

為多維陣列配置一個非0的預設值

此外我們還可以建立預設值為非0的多維陣列,只需在例項化時稍作改寫。具體如下例:

from collections import defaultdict

#建立一個二維陣列
#如果低維度key未初始化時的預設值是2
my_dict = defaultdict(lambda: defaultdict(lambda: 2))
my_dict[1][1] += 1
#output: 1
print my_dict[1][1]

reference