我正在尝试编写类似zip的功能。我不擅长解释我的意思,所以我只会显示我要执行的操作的“代码”。

a = [1,2,3,[4,5]]
b = a[:]
zip(a, b) == [(1,1), (2,2), (3,3), ([4,5],[4,5])]
myzip(a, b) == [(1,1), (2,2), (3,3), [(4,4), (5,5)]]

我对此深感困惑,甚至都不好笑。我试图使用递归lambda以一种简单的功能方式编写它,以使我的代码更漂亮。我想要这样的myzip,因为我想将其输出与我编写的另一个函数结合使用,该函数将一个函数映射到树
def tree_map(func, tree):
    return map(lambda x: func(x) if not isinstance(x, list) else tree_map(func, x),
               tree)

我一直在尝试用zip做类似的事情,但似乎无法将其包裹住。有人对我如何编写myzip有任何想法吗?

编辑:看看tree_map!不太漂亮!我至少这么认为,但是我的母语是Scheme:P
而且,我希望myzip能够深入到需要的深度。基本上,我希望myzip保留我通过的树的结构。另外,myzip将仅处理相同形状的树。

最佳答案

我认为以下应该起作用:

import collections

def myzip(*args):
    if all(isinstance(arg, collections.Iterable) for arg in args):
        return [myzip(*vals) for vals in zip(*args)]
    return args

结果:
>>> a = [1,2,3,[4,[5,6]]]
>>> b = [1,2,3,[4,[5,6]]]
>>> myzip(a, b)
[(1, 1), (2, 2), (3, 3), [(4, 4), [(5, 5), (6, 6)]]]

请注意,我在类型检查中使用了 collections.Iterable 而不是list,因此其行为更类似于带有元组和其他可迭代对象的zip()

09-04 15:43