2015-11-09 54 views
0

我需要一個簡單的嵌套字典的包裝,我試圖像這樣的Python - 包裝嵌套字典

class DictWrapper(object): 

    def __init__(self, x_names, y_names): 
     self._dict = {} 
     for x in x_names: 
      self._dict[x] = {} 
      for y in y_names: 
       self._dict[x][y] = {} 

    def __setitem__(self, x, y, val): 
     self._dict[x][y] = val 

    def __getitem__(self, x, y): 
     return self._dict[x][y] 


if __name__ == '__main__': 
    results_holder = DictWrapper(['x1', 'x2', 'x3'], ['y1', 'y2']) 
    results_holder['x1']['y2'] = 11 

然而,這導致了以下錯誤:

results_holder['x1']['y2'] = 11 
TypeError: __getitem__() takes exactly 3 arguments (2 given) 

我是在正確的軌道上?我怎樣才能使這種簡單的字典包裝工作?

+0

這裏'self._dict [X] [Y] = {}'你說'字典[X] [Y]'是一個字典。 '11'不是字典。 (雖然你應該可以將它設置爲任何值,這很奇怪) – njzk2

+0

你需要預先指定密鑰嗎? 'defaultdict(dict)'會爲你工作嗎? – mgilson

+1

阻止你使用非嵌套字典的東西是什麼? 'results_holder = {}; results_holder ['x1','y2'] = 11'正常工作。 – user2357112

回答

1

我的解決方案 - 單鍵

class DictWrapper(object): 

    def __init__(self, x_names, y_names): 
     self._dict = {} 
     for x in x_names: 
      self._dict[x] = {} 
      for y in y_names: 
       self._dict[x][y] = {} 

    def __setitem__(self, key, val): # single key 
     self._dict[key[0]][key[1]] = val 

    def __getitem__(self, key): # single key 
     return self._dict[key[0]][key[1]] 


results_holder = DictWrapper(['x1', 'x2', 'x3'], ['y1', 'y2']) 
results_holder[('x1','y2')] = 11 
print results_holder[('x1','y2')] 

# without() works too 
results_holder['x1','y2'] = 11 
print results_holder['x1','y2'] 
-1

Python字典已經可以被嵌套。

您已經可以構建dictionnary要與itertools.product方式:

from itertools import product 

x = ['x1', 'x2', 'x3'] 
y = ['y1', 'y2'] 
results_holder = dict(# transform to dict 
    product(# build the matrice 
     x, [dict(product(y, [{}]))] 
    )) 
results_holder['x1']['y2'] = 11