使用(尝试)递归来反转列表中的列表

时间:2013-03-16 12:58:00

标签: python

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]]。 我做错了什么?我不是吗?

5 个答案:

答案 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]