Python 深度压缩

2023-12-08

我正在尝试编写一个像 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

Result:

>>> 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()与元组和其他可迭代对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 深度压缩 的相关文章