例如:
A=[1,[2,3],[4,[5,6]],7]
B=[2,3,4,5,6,7,8]
我如何获得[2,[3,4],[5,[6,7]],8]
?
答案 0 :(得分:9)
您可以使用非常简单的递归函数:
def match(struct, source):
try:
return [match(i, source) for i in struct]
except TypeError:
return next(source)
A=[1,[2,3],[4,[5,6]],7]
B=[2,3,4,5,6,7,8]
match(A, iter(B))
# [2, [3, 4], [5, [6, 7]], 8]
以下是某些人可能更容易理解的功能版本:
def match(struct, source, index=0):
if isinstance(struct, list):
r = []
for item in struct:
next, index = match(item, source, index)
r.append(next)
return r, index
else:
return source[index], index + 1
A=[1,[2,3],[4,[5,6]],7]
B=[2,3,4,5,6,7,8]
match(A, B)
基本思想是首先循环输入结构深度,并相应地使用源中的值。当我们点击一个数字时,我们可以简单地从源代码中取一个数字。如果我们点击列表,我们需要将此算法应用于该列表。一路上需要跟踪我们消耗了多少物品。
算法的第一个版本完成了所有这些,但方式略有不同。 iter(B)
创建一个迭代器,跟踪b中已消耗了多少项,并在我调用next(source)
时提供下一项,因此我不必显式跟踪索引。 try / except检查我是否可以遍历struct
。如果可以的话,返回一个列表,如果我不能执行expect块并返回next(source)
。