访问嵌套列表和dicts中的所有元素,无需递归

时间:2016-09-19 18:08:12

标签: python recursion data-structures

我有一个由嵌套列表和dicts组成的结构。我想申请一个 对每个元素起作用。怎么做没有递归。

def visit(data, func):
    if isinstance(data, dict):
        for k, v in data.items():
            data[k] = visit(v, func)
        return data
    elif isinstance(data, list):
        for i, v in enumerate(data):
            data[i] = visit(v, func)
        return data
    else:
        return func(data)

递归版本适用于小数据,但我点击了RecursionError 数据很大时的异常。

我寻找消除递归的一般方法,我发现依赖的方法 首先将递归调用转换为尾调用,我的问题是 我的例子中的递归调用是在循环中。

1 个答案:

答案 0 :(得分:5)

这种方法可行。但是,对于记录,我同意Sven Marnach的说法,如果你的嵌套打破了递归限制,那么你的数据结构中就会出现一些肯定可疑的。如果像Sven推测的那样,你的数据中有循环,这种方法也会破裂。

data = [1,2, {'a':1, 'b':{'a':[1,2,3]}},3]

def apply(data, f):
    stack = []
    stack.append(data)
    while stack:
        data = stack.pop()
        if isinstance(data, dict):
            for k,v in data.items():
                if isinstance(v, (dict,list)):
                    stack.append(v)
                else:
                    data[k] = f(v)
        if isinstance(data, list):
            for i,e in enumerate(data):
                if isinstance(e, (dict,list)):
                    stack.append(e)
                else:
                    data[i] = f(e)

在解释器shell中:

$ python -i apply.py
>>> apply(data, lambda x: x + 1)
>>> data
[2, 3, {'a': 2, 'b': {'a': [2, 3, 4]}}, 4]
>>>