<p>我一直在玩弄使用多个索引和<code>defaultdict</code>的想法。结果是:</p>
<pre><code>from collections import defaultdict
class LayeredDict(defaultdict):
def __getitem__(self, key):
if isinstance(key, (tuple, list)):
if len(key) == 1:
return self[key[0]]
return self[key[0]][key[1:]]
return super(LayeredDict, self).__getitem__(key)
def __setitem__(self, key, value):
if isinstance(key, (tuple, list)):
if len(key) == 1:
self[key[0]] = value
else:
self[key[0]][key[1:]] = value
else:
super(LayeredDict, self).__setitem__(key, value)
def __init__(self, *args, **kwargs):
super(LayeredDict, self).__init__(*args, **kwargs)
self.default_factory = type(self) # override default
</code></pre>
<p>我还没有完全测试它,但是它应该允许您创建任何级别的嵌套字典,并使用元组对它们进行索引。你知道吗</p>
<pre><code>>>> x = LayeredDict()
>>> x['abc'] = 'blah'
>>> x['abc']
'blah'
>>> x[0, 8, 2] = 1.2345
>>> x[0, 8, 1] = 8.9
>>> x[0, 8, 'xyz'] = 10.1
>>> x[0, 8].keys()
[1, 2, 'xyz']
>>> x['abc', 1] = 5
*** TypeError: 'str' object does not support item assignment
</code></pre>
<p>不幸的是,不支持扩展符号(或任何它的名称),但是
您只需传入一个列表或元组作为索引。你知道吗</p>
<pre><code>>>> keylist = (0, 8, 2)
>>> x[*keylist]
*** SyntaxError: invalid syntax (<stdin>, line 1)
>>> x[keylist]
1.2345
</code></pre>
<p>此外,<code>isinstance(key, (tuple, list))</code>条件意味着元组不能用作键。你知道吗</p>