[英]visit all elements in nested lists and dicts without recursion
我有一个由嵌套列表和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异常。
我寻找消除递归的一般方法,我发现依赖于首先将递归调用转换为尾调用,我的问题是我的例子中的递归调用是在循环内部。
这种方法会起作用。 但是,对于记录,我同意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]
>>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.