在Python中递归地镜像嵌套元组

7

我将尝试编写一个函数,输入一个嵌套元组,并返回一个元组,其中所有元素都是反向的,包括其他元组中的元素(基本上是镜像)。 因此,使用此输入:

((1, (2, 3)), (4, 5))

它应该返回:
((5, 4), ((3, 2), 1))

我尝试过的方法

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

3
不必将元组转换为列表才能对其进行反转。在元组上使用t = t[::-1]即可实现反转。 - khelwood
4个回答

9
也许我有所遗漏,但我认为这可以相对简单地完成:
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))

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


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

>>> mirror(((1, (2, 3)), (4, 5)))
((5, 4), ((3, 2), 1))

感谢 Chris_Rands 的改进。
以下是 PM2 Ring 提供的更简单的解决方案 -
def mirror(t):
    return tuple(mirror(u) for u in t[::-1]) if isinstance(t, tuple) else t

>>> mirror(((1, (2, 3)), (4, 5)))
((5, 4), ((3, 2), 1))

它使用生成器表达式递归地构建结果元组。

4
这种结构,列表内嵌列表,被称为分层结构。它的特点是整个结构由类似于大结构的小结构组装而成,这些小结构又是由更小的结构组装而成。
想象一棵树,树枝像整棵树,树叶在末梢。第一件事是区分树枝和树叶。如果你看到一个树枝,就将其视为一棵小树(这自然形成了递归)。如果你看到一个叶子,那意味着你已经到达了结构的末端,可以返回它(递归的基本情况)。
从大的树枝到小的树枝(递归中的推导),通常有两种递归方法。第一种是像我所做的那样,将树枝分成左右两部分,并沿着每个部分走。另一种方法是在每个树枝上进行映射,就像khelwood所做的那样。
def mirror(T):
    if not isinstance(T, tuple):
        return T 
    elif T == ():
        return ()
    else:
        return mirror(T[1:]) + (mirror(T[0]),)

print(mirror(((1,(2,3)),(4,5))))

0

忍不住 :)

(这当然是一个玩笑,但有颠倒数字的额外好处 ;)

def rev(s, i, acc):
  if i == len(s):
    return acc

  ps = {'(': ')', ')': '('}

  return rev(s, i + 1, s[i] + acc) if not s[i] in ps else rev (s, i + 1, ps[s[i]] + acc)

def funnyMirror(t):
  return eval(rev(str(t), 0, ''))

print funnyMirror(((1, (2, 83)), (4, 5))) # ((5, 4), ((38, 2), 1))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接