你必須放棄你返回無的要求。如果d[key] is None
,d[key][subkey] = value
相當於None[subkey] = value
,這是行不通的。
你可以用缺失值做什麼,就是返回一個空的類似於字典的對象,而不必將它分配給一個鍵。如果該對象持有對父級的引用,則可以延遲該分配,直到在層級下有明確的分配。
示例實現(這是不完整的,你必須做的比覆蓋setitem有一個全功能的字典子類):
class NestedDict(dict):
def __init__(self, parent=None, parentkey=None):
self.parent = parent
self.parentkey = parentkey
def __missing__(self, key):
return NestedDict(self, key)
def __setitem__(self, key, value):
if self.parent is not None:
self.parent[self.parentkey] = self
self.parent = None
super(NestedDict, self).__setitem__(key, value)
>>> d = NestedDict()
>>> d[1][2][3] = 4
>>> d[2]
{}
>>> d.keys()
[1]
>>> d[1][2][3]
4
另一種方法是將覆蓋__getitem__
和__setitem__
做當鍵是一個元組時,嵌套查找。此版本爲__getitem__
提供了一個KeyError,以便與常規詞典保持一致。如果您願意,您可以輕鬆更改它以返回None。
class NestedDict(dict):
def __getitem__(self, key):
if isinstance(key, tuple):
try:
x = self
for k in key:
x = x[k]
return x
except (KeyError, TypeError):
raise KeyError(key)
else:
return super(NestedDict, self).__getitem__(key)
def __setitem__(self, key, value):
if isinstance(key, tuple):
d = self
for k in key[:-1]:
d = d.setdefault(k, NestedDict())
d[key[-1]] = value
else:
super(NestedDict, self).__setitem__(key, value)
>>> d = NestedDict()
>>> d[1,2,3] = 4
>>> d[1,2,3]
4
>>> d[1,2,4]
KeyError: (1, 2, 4)
>>> d
{1: {2: {3: 4}}}
'get'方法適合您的需要嗎? d.get(key,None)用於字典'd'? – beardc
需要支持哪個版本的Python? – Barry
@Barry,我正在使用2.7 – skyork