2
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]]。我做错了什么?我没有想过吗?

4

5 回答 5

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]
于 2013-03-16T13:05:09.997 回答
3

基于Pavel Anossov 的更通用的 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).

于 2013-03-16T13:30:55.703 回答
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
于 2013-03-16T13:04:22.073 回答
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)
于 2013-03-16T13:20:39.317 回答
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]
于 2013-03-16T13:06:34.663 回答