4
我想擴展the autovivification example在nosklo以前的答案給出允許字典訪問元組。如何使用元組訪問深度嵌套的字典?
nosklo的解決方案是這樣的:
class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
測試:
a = AutoVivification()
a[1][2][3] = 4
a[1][3][3] = 5
a[1][2]['test'] = 6
print a
輸出:
{1: {2: {'test': 6, 3: 4}, 3: {3: 5}}}
我有一個情況,我想設置一個給定任意下標的元組的節點。如果我不知道元組的深度有多少層,那麼我如何設計一種方法來設置合適的節點?
我在想,也許我可以使用類似下面的語法:
mytuple = (1,2,3)
a[mytuple] = 4
,但我有拿出一個工作實現麻煩。
更新
我有一個基於@ JCash的回答完全工作示例:
class NestedDict(dict):
"""
Nested dictionary of arbitrary depth with autovivification.
Allows data access via extended slice notation.
"""
def __getitem__(self, keys):
# Let's assume *keys* is a list or tuple.
if not isinstance(keys, basestring):
try:
node = self
for key in keys:
node = dict.__getitem__(node, key)
return node
except TypeError:
# *keys* is not a list or tuple.
pass
try:
return dict.__getitem__(self, keys)
except KeyError:
raise KeyError(keys)
def __setitem__(self, keys, value):
# Let's assume *keys* is a list or tuple.
if not isinstance(keys, basestring):
try:
node = self
for key in keys[:-1]:
try:
node = dict.__getitem__(node, key)
except KeyError:
node[key] = type(self)()
node = node[key]
return dict.__setitem__(node, keys[-1], value)
except TypeError:
# *keys* is not a list or tuple.
pass
dict.__setitem__(self, keys, value)
可實現輸出一樣使用擴展切片音符上面:
d = NestedDict()
d[1,2,3] = 4
d[1,3,3] = 5
d[1,2,'test'] = 6
'node = node [i] = type(self)()'似乎不能正常工作。我不得不把它分成兩個單獨的作業。你知道爲什麼嗎? – 2013-02-26 03:23:33
嗯,不,我不知道我害怕。 – JCash 2013-03-02 15:00:21