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
我需要一个简单的嵌套字典包装器,我试过这样的东西
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