在python中默認的dict方法定義多維字典較爲複雜
並不能直接通過
a=dict() a['b']['c']['d'] = 1 >>> a['b']['c']['d']=1 Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'b'
如果想要創建多維字典,需要這樣做
>>> a={} >>> >>> a['b'] = {} >>> a['b']['c']={} >>> a['b']['c']['d'] = 1 >>> a {'b': {'c': {'d': 1}}}
比較繁瑣
比較推薦的創建多維字典的方法有4種:
第一種
from collections import defaultdict def site_struct(): return defaultdict(board_struct) def board_struct(): return defaultdict(user_struct) def user_struct(): return dict(pageviews=0,username='',comments=0) userdict = defaultdict(site_struct) userdict['site']['board']['username'] = 1 userdict['par']['chl']['username'] = 'ceshi' print userdict['site']['board']['username'] print userdict['par']['chl']['username']
利用collections模塊defaultdict方法的特性,利用外部函數來實現
第二種
userdict = {} userdict[('site1', 'board1', 'username')] = 'tommy'
利用元組來充當多維字典的key,即將多維key按照規則放入元組中,使用該元組作爲字典的key並賦值,以達到多維key的效果
第三種
from collections import defaultdict from collections import Counter def multi_dimensions(n, type): if n<=1: return type() return defaultdict(lambda:multi_dimensions(n-1, type)) m = multi_dimensions(5, Counter) m['d1']['d2']['d3']['d4'] = 1 >>> m defaultdict(<function <lambda> at 0x322c70>, {'d1': defaultdict(<function <lambda> at 0x322870>, {'d2': defaultdict(<function <lambda> at 0x322cf0>, {'d3': defaultdict(<function <lambda> at 0x322d30>, {'d4': 1})})})})
這種方法更像是一個迭代器,迭代創建
第四種
from collections import defaultdict def nesteddict(): return defaultdict(nesteddict) >>> c['key1']['key2']['key3'] = 10 >>> c defaultdict(<function nesteddict at 0x322cf0>, {'key1': defaultdict(<function nesteddict at 0x322cf0>, {'key2': defaultdict(<function nesteddict at 0x322cf0>, {'key3': 10})})})
這種方法從根本上講,就是一個迭代器