Python - 嵌套字典的包装器

Python - wrapper for nested dictionary

我需要一个简单的嵌套字典包装器,我试过这样的东西

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)

我走在正确的轨道上吗?我怎样才能使这种简单的字典包装器工作?

我的解决方案——单键

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']

Python 字典已经可以嵌套了。

您已经可以使用 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