我有嵌套的python列表和词典结构。
tree = { 'blah': [ "booz", {'foobar': [ { 'somekey': 'someval' } ] } ] }
我还有几个递归函数,允许我从上到下遍历tree
层次结构,并返回我需要的键和值。例如:
def get_objectcontent(obj, objid):
result = None
if isinstance(obj, dict):
for key, val in obj.items():
if key == objid:
result = val
elif isinstance(val, list) or isinstance(val, dict):
retval = get_objectcontent(val, objid)
if retval is not None:
result = retval
elif isinstance(obj, list):
for elem in obj:
if isinstance(elem, list) or isinstance(elem, dict):
retval = get_objectcontent(elem, objid)
if retval is not None:
result = retval
return result
不幸的是,我也希望修改tree
中的数据,这就是问题所在。我可以看到的唯一可能的解决方案是在向下遍历tree
时动态构造元素的“路径”,并构造如下内容:
tree['blah'][1]['foobar'][0]['somekey']) = 'newval'
我没有找到任何方法如何在Python中指向我的密钥(当我知道它在结构中的位置时)。
在Python 3中是否有其他更智能的方法来解决这个问题?
答案 0 :(得分:0)
您最终会在objid
中找到dict
作为关键字,因此您可以更改:
result = val
为:
result = obj
然后来电者可以这样做:
result[objid] = new_val
您也可以考虑将result
的作业替换为return
语句,假设您不介意获取第一个实例而不是最后一个实例。