匹配列表的结构?

时间:2016-09-07 03:49:45

标签: python list

例如:

A=[1,[2,3],[4,[5,6]],7]
B=[2,3,4,5,6,7,8]

我如何获得[2,[3,4],[5,[6,7]],8]

1 个答案:

答案 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)