Я использую словари для всех случаев:
def set_3dict(dict3,x,y,z,val):
"""Set values in a 3d dictionary"""
if dict3.get(x) == None:
dict3[x] = {y: {z: val}}
elif dict3[x].get(y) == None:
dict3[x][y] = {z: val}
else:
dict3[x][y][z] = val
d={}
set_3dict(d,0,0,0,6)
set_3dict(d,0,0,1,3)
set_3dict(d,0,0,2,4)
...
В анологии у меня есть геттер
def get_3dict(dict3, x, y, z, preset=None):
"""Read values from 3d dictionary"""
if dict3.get(x, preset) == preset:
return preset
elif dict3[x].get(y, preset) == preset:
return preset
elif dict3[x][y].get(z, preset) == preset:
return preset
else: return dict3[x][y].get(z)
>>> get3_dict(d,0,0,0)
6
>>> d[0][0][0]
6
>>> get3_dict(d,-1,-1,-1)
None
>>> d[-1][-1][-1]
KeyError: -1
На мой взгляд, преимущество заключается в том, что итерации по полю весьмапросто:
for x in d.keys():
for y in d[x].keys():
for z in d[x][y].keys():
print d[x][y][z]