我读到您可以将任何递归函数转换为迭代函数。我有一个迭代函数,可从此处显示的嵌套列表中获取值:
filled_list = [1,2,3,[1,2,3,[1,2,3,[1,2,3,4]]]]
递归函数:
def recursive_list(value, count):
x, _, _, _d = value
if not count%2:
yield x
yield from ([] if not isinstance(_d, list) else recursive_list(_d, count+2))
x = recursive_list(filled_list, 0)
print(list(x), "Parsing a list recursively.")
输出:[1、1、1、1]递归解析列表。
我正在尝试将其转换为迭代函数。这是我到目前为止所拥有的。我陷入困境,不知道如何遍历每个嵌套列表,直到到达末尾。输出应与递归函数相同。
def iterative_list(value):
value_list = []
for a in value:
for _d in value:
a, _, _, _d = value
y, _, _, _d = _d
value_list.append(a)
value_list.append(y)
return value_list
z = iterative_list(filled_list)
print(z, "Parsing a list iteratively.")
答案 0 :(得分:1)
假设您的输入将始终遵循相同的模式,即三个整数,然后是一个列表,则可以简单地使用while
循环:
def get_first(d):
while isinstance(d[-1], list):
a, *_, d = d
yield a
yield d[0]
print(list(get_first([1,2,3,[1,2,3,[1,2,3,[1,2,3,4]]]])))
输出:
[1, 1, 1, 1]
时间:
import time
def timeit(f):
_start = time.time()
_ = list(f([1,2,3,[1,2,3,[1,2,3,[1,2,3,4]]]]))
print(f'{f.__name__} finished in {time.time()-_start} seconds')
@timeit
def get_first_iterative(d):
while isinstance(d[-1], list):
a, *_, d = d
yield a
yield d[0]
@timeit
def get_first_recursive(d):
def recursive_list(value):
x, _, _, _d = value
yield x
yield from ([] if not isinstance(_d, list) else recursive_list(_d))
return recursive_list(d)
输出:
get_first_iterative finished in 2.7894973754882812e-05 seconds
get_first_recursive finished in 1.7881393432617188e-05 seconds
虽然从上述时序来看,递归解决方案比迭代解决方案要快,但事实并非如此,因为每个解决方案的时序对数据的深度最大为100,这表明:
以上情节的源代码可以在here
中找到