使用递归确定嵌套函数的索引路径
Using recursion to determine the index path of a nested function
我正在尝试创建一个函数,该函数使用另一个列表 (index_list) 作为索引路径从列表 (xs) 中查找值。
我的函数应该像这样工作:
xs = [[[1, 2], 3], [4, 5, [6, 7]], 8, [9, 10, 11]]
>>> recursive_index(xs, [1, 2, 0])
6
到目前为止我有:
def recursive_index(xs: List, index_path):
if not index_path:
return 0
return recursive_index(xs, index_path[1:])
然而这只是 returns 0 的一切,但我不知道基本情况应该是什么。
你想要这个:
def recursive_index(xs, index_path):
if not index_path:
# if path is exhausted just return current element
return xs
# use first index on current list and recurse with the remaining path
return recursive_index(xs[index_path[0]], index_path[1:])
您已经很接近了,但是您忘记了在每次递归时您实际上需要为列表编制索引,以便在每次递归时获得更多信息。这样,当您到达基本情况时,变量 xs
将存储正确的结果,您可以 return 它。
代码如下所示:
def recursive_index(xs: List, index_path):
if not index_path:
return xs
return recursive_index(xs[index_path[0]], index_path[1:])
你的递归函数应该在 index_path
的第一个索引处继续从 xs
中提取值,直到路径的其余部分没有更多索引:
def recursive_index(xs, index_path):
index, *rest = index_path
value = xs[index]
return recursive_index(value, rest) if rest else value
接受的答案已经解释了如何修复递归函数。
请注意,迭代函数同样有效:
def iterative_index(xs, index_path):
for idx in index_path:
xs = xs[idx]
return xs
或使用reduce
:
from functools import reduce
def reduce_index(xs, index_path):
return reduce(list.__getitem__, index_path, xs)
测试:
xs = [[[1, 2], 3], [4, 5, [6, 7]], 8, [9, 10, 11]]
index_path = (1, 2, 0)
print( iterative_index(xs, index_path) )
# 6
print( reduce_index(xs, index_path) )
# 6
我正在尝试创建一个函数,该函数使用另一个列表 (index_list) 作为索引路径从列表 (xs) 中查找值。
我的函数应该像这样工作:
xs = [[[1, 2], 3], [4, 5, [6, 7]], 8, [9, 10, 11]]
>>> recursive_index(xs, [1, 2, 0])
6
到目前为止我有:
def recursive_index(xs: List, index_path):
if not index_path:
return 0
return recursive_index(xs, index_path[1:])
然而这只是 returns 0 的一切,但我不知道基本情况应该是什么。
你想要这个:
def recursive_index(xs, index_path):
if not index_path:
# if path is exhausted just return current element
return xs
# use first index on current list and recurse with the remaining path
return recursive_index(xs[index_path[0]], index_path[1:])
您已经很接近了,但是您忘记了在每次递归时您实际上需要为列表编制索引,以便在每次递归时获得更多信息。这样,当您到达基本情况时,变量 xs
将存储正确的结果,您可以 return 它。
代码如下所示:
def recursive_index(xs: List, index_path):
if not index_path:
return xs
return recursive_index(xs[index_path[0]], index_path[1:])
你的递归函数应该在 index_path
的第一个索引处继续从 xs
中提取值,直到路径的其余部分没有更多索引:
def recursive_index(xs, index_path):
index, *rest = index_path
value = xs[index]
return recursive_index(value, rest) if rest else value
接受的答案已经解释了如何修复递归函数。
请注意,迭代函数同样有效:
def iterative_index(xs, index_path):
for idx in index_path:
xs = xs[idx]
return xs
或使用reduce
:
from functools import reduce
def reduce_index(xs, index_path):
return reduce(list.__getitem__, index_path, xs)
测试:
xs = [[[1, 2], 3], [4, 5, [6, 7]], 8, [9, 10, 11]]
index_path = (1, 2, 0)
print( iterative_index(xs, index_path) )
# 6
print( reduce_index(xs, index_path) )
# 6