使用反转功能在python中反转嵌套元组

时间:2012-09-24 11:23:29

标签: python

我有一个元组,想在python中反转它。

元组如下所示:(2,(4,(1,(10,None))))。

我尝试通过

在python中进行反转
a = (2, (4, (1, (10, None))))
b = reversed(a)

它让我回答:

<reversed object at 0x02C73270>

我如何反过来?或者我必须写一个函数来做这个吗?

结果应如下所示:

((((None, 10), 1), 4), 2)

对早期部分道歉...

4 个答案:

答案 0 :(得分:3)

def my_reverser(x):
  try:
    x_ = x[::-1]
  except TypeError:
    return x
  else:
    return x if len(x) == 1 else tuple(my_reverser(e) for e in x_)

答案 1 :(得分:3)

尝试这种深度反转功能:

def deep_reverse(t):
    return tuple(deep_reverse(x) if isinstance(x, tuple) else x 
                 for x in reversed(t))

这将处理任意嵌套的元组,而不仅仅是两元组。

答案 2 :(得分:2)

正如documentation中所解释的,reversed函数返回一个迭代器(因此<reversed at ...>)。如果您想要获取列表或元组,请使用list(reversed(...))tuple(reversed(...))

然而,这只是我们问题的一部分:您将初始对象(2, (...))转换为(...,2),而...保持不变。您必须实现递归反向:如果输入元组的一个元素是可迭代的,则需要将其反转为。

答案 3 :(得分:1)

reversed执行此操作没有意义,抱歉。但是一个简单的递归函数会返回你想要的东西:

def reversedLinkedTuple(t):
  if t is None:
    return t
  a, b = t
  return reversedLinkedTuple(b), a

reversed仅可用于可逆的可迭代对象,如列表,元组等。您正在使用的内容(链接列表)在Python内置iter的意义上是不可迭代的。

您可以为链接列表编写一个包装类来实现它,然后提供一个反向迭代器,但我认为这样做太过分了,并不适合您的需要。