gpt4 book ai didi

python - 无需递归访问嵌套列表和字典中的所有元素

转载 作者:太空狗 更新时间:2023-10-30 02:41:22 25 4
gpt4 key购买 nike

我有一个由嵌套列表和字典组成的结构。我想申请一个作用于每个元素。如何在不递归的情况下做到这一点。

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)

在解释器外壳中:

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

关于python - 无需递归访问嵌套列表和字典中的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39579513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com