访问列表/ dicts的任意嵌套结构中的元素

时间:2015-11-03 14:15:24

标签: python list dictionary

我有嵌套的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中是否有其他更智能的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

您最终会在objid中找到dict作为关键字,因此您可以更改:

result = val

为:

result = obj

然后来电者可以这样做:

result[objid] = new_val

您也可以考虑将result的作业替换为return语句,假设您不介意获取第一个实例而不是最后一个实例。