在Python中递归镜像嵌套元组

shi*_*iru 6 python recursion python-3.x

我试图编写一个输入嵌套元组的函数,并返回一个元组,其中所有元素都向后,包括其他元组中的元素(基本上镜像它).所以有了这个输入:

((1, (2, 3)), (4, 5))
Run Code Online (Sandbox Code Playgroud)

它应该返回:

((5, 4), ((3, 2), 1))
Run Code Online (Sandbox Code Playgroud)

我尝试了什么

def mirror(t):
    n = 1
    for i in t:
        if isinstance(i, tuple):
            mirror(i)
        if n == len(t):
            t = list(t)
            t = t[::-1]
            t = tuple(t)
        n += 1
    return t
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 7

这个问题的棘手在于tuple对象是不可变的.我能想到的一个解决方案是在最终反转结果中递归构建每个部分,然后使用itertools它们将它们连接在一起.

from itertools import chain

def mirror(data):
    r = []
    for t in reversed(data):
        if isinstance(t, tuple):
            t = mirror(t)
        r.append((t, ))

    return tuple(chain.from_iterable(r))
Run Code Online (Sandbox Code Playgroud)

>>> mirror(((1, (2, 3)), (4, 5)))
((5, 4), ((3, 2), 1))
Run Code Online (Sandbox Code Playgroud)

感谢Chris_Rands的改进.


这是一个更简单的解决方案,礼貌PM2戒指 -

def mirror(t):
    return tuple(mirror(u) for u in t[::-1]) if isinstance(t, tuple) else t
Run Code Online (Sandbox Code Playgroud)

>>> mirror(((1, (2, 3)), (4, 5)))
((5, 4), ((3, 2), 1))
Run Code Online (Sandbox Code Playgroud)

它以递归方式构建结果元组,但使用gen comp.


khe*_*ood 7

也许我错过了一些东西,但我认为它可以相对简单地完成:

def mirror(data):
    if not isinstance(data, tuple):
        return data
    return tuple(map(mirror, reversed(data)))

>>> mirror(((1, (2, 3)), (4, 5)))
((5, 4), ((3, 2), 1))
Run Code Online (Sandbox Code Playgroud)

这将mirror函数应用于元组中的每个元素,将它们以相反的顺序组合成一个新元组.