def is_list(p):
return isinstance(p, list)
def deep_reverse(p):
initial = []
for v, e in enumerate(p):
if is_list(e):
#print p[v][::-1]
initial.append(p[v][::-1])
deep_reverse(e)
return initial
p = [1, [2, 3, [4, [5, 6, [7, 8]]]]]
print deep_reverse(p)
我得到[[[4, [5, 6, [7, 8]]], 3, 2]]
,至少是预期的(我没有费心去弄清楚如何不丢失第一个列表[1[...]]
)[[[[6, 5, [8, 7]], 4], 3, 2]]
。
正如您所看到的,代码只会反转[ [2, 3]]
- > [[3,2]]。
我做错了什么?我不是吗?
答案 0 :(得分:5)
我就是这样做的:
def deep_reverse(p):
return [deep_reverse(x) if isinstance(x, list) else x for x in p[::-1]]
p = [1, [2, 3, [4, [5, 6, [7, 8]]]]]
print deep_reverse(p) # [[[[[8, 7], 6, 5], 4], 3, 2], 1]
答案 1 :(得分:3)
基于Pavel Anossov's的更为通用的Pythonic答案如下:
def deep_reversed(seq):
return [deep_reversed(x) if (isinstance(x, collections.Sequence) and
not isinstance(x, str)) else x
for x in reversed(seq)]
请注意,这适用于Python 3.x,在Python 2.x中,您需要isinstance(x, basestring)
来允许使用Unicode字符串。
这个答案很好,因为它可以正常使用任何充当序列的对象 - 无论是列表,元组还是自定义类。这意味着它更加灵活。
编辑:如果你想让它在内部反转字符串:
def deep_reversed(seq):
for x in reversed(seq):
if isinstance(x, collections.Sequence):
if isinstance(x, str):
yield "".join(reversed(x))
else:
yield deep_reversed(x)
else:
yield x
同样,在2.x中,使用isinstance(x, basestring)
。
答案 2 :(得分:2)
在对deep_reverse(e)
的递归调用中,您没有使用返回的值。看起来好像你希望它修改输入列表
您可以将其更改为:
def deep_reverse(p):
initial = []
for e in p[::-1]:
if is_list(e):
initial.append(deep_reverse(e)])
else:
initial.append(e)
return initial
答案 3 :(得分:2)
已经有很多很好的解决方案,但也许这就是你正在尝试的算法:
def is_list(p):
return isinstance(p, list)
def deep_reverse(p):
initial = p[::-1] # reverse this level
for v, e in enumerate(initial):
if is_list(e): # for all the sublist in this level
initial[v] = deep_reverse(e) # recursively call deep_reverse to reverse the sublist
return initial
p = [1, [2, 3, [4, [5, 6, [7, 8]]]]]
print deep_reverse(p)
答案 4 :(得分:1)
这将解决您的目的:
import collections
def dr(p):
r=[]
for i in p:
if isinstance(i,collections.Iterable):
r.append(dr(i))
else:
r.append(i)
return r[::-1]