我有一个嵌套的Python字典,需要将某个键设置为某个值。例如
x['key1']['key2']['key3'] = value
如果我提前知道层次结构,这有效。事实并非如此。我正在寻找一种寻址方案,例如"key1/key2/key3",可以在运行时指定它来访问所需的键值对。有什么建议吗?
作为方法的最初开始,您可以将像'key1/key2/key3'
这样的字符串解析为一个可以执行所需操作的函数。例如:
# Assuming for this example that s is just a `/`-delimted string of keys.
def make_getter(s):
keys = s.split("/")
def _(d):
rv = d
for k in keys:
try:
rv = rv.get(k)
except AttributeError:
rv = None
break
return rv
return d
然后
>>> accessor = make_getter("foo/bar/baz")
>>> accessor({'foo': {'bar': {'baz': 3}}})
3
>>> accessor({'foo': 9})
None
您可以使用递归方法来搜索嵌套字典表示形式,直到找到"key1",然后返回 [key1][key2][key3] 查找。这假定 key1 在数据结构中没有重复。
In [9]: def lookup(key, nested_dict):
...: for k, v in nested_dict.items():
...: if k == key:
...: return v
...: if isinstance(v, dict):
...: val = lookup(key, v)
...: if val:
...: return val
...: return None
In [10]: a = {'b' :{'c':{'d':1}}, 'f':2}
In [11]: lookup('d', a)
Out[11]: 1
In [12]: lookup('b', a)
Out[12]: {'c': {'d': 1}}
In [13]: lookup('c', a)
Out[13]: {'d': 1}