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)
这个问题的棘手在于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.
也许我错过了一些东西,但我认为它可以相对简单地完成:
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函数应用于元组中的每个元素,将它们以相反的顺序组合成一个新元组.
| 归档时间: |
|
| 查看次数: |
532 次 |
| 最近记录: |