2012-06-02 97 views
2

我有一个嵌套列表,我需要反转列表中的每个元素。但我不知道列表是否是列表的列表或不列表。 因此例子是:列表中的Python深度反转

p = [1, [2, 3, [4, [5, 6]]]] 
print deep_reverse(p) 
#>>> [[[[6, 5], 4], 3, 2], 1] 

q = [1, [2,3], 4, [5,6]] 
print deep_reverse(q) 
#>>> [ [6,5], 4, [3, 2], 1] 

我至今是:

def is_list(p): 
    return isinstance(p, list) 

def deep_reverse(a): 
    a.reverse() 
    for i in a: 
     if is_list(i): 
      i.reverse() 
      print a 

它运作良好,第二次测试时,q之一,但对于第一次测试行的事工作。 我不知道我需要使用递归循环整个事情吗?我如何修改我的代码?谢谢。

+1

是的,你确实需要递归。 (你有没有试图这样做?) – huon

+2

闻起来像作业 – inspectorG4dget

+0

你的功能只深入到列表中2级。正如dbaupp所说,你需要利用递归。作为提示,你的回答是正确的,除了1行;) –

回答

4

原因代码不工作是因为如果i是列表的列表,则不需要deep_reverse列表中的i

你只需要你的代码的一行更改为以下:

def is_list(p): 
    return isinstance(p, list) 

def deep_reverse(a): 
    a.reverse() 
    for i in a: 
     if is_list(i): 
      deep_reverse(i) # <=== This is what changed 
      print a 
+0

:非常感谢你的帮助。它的工作原理!!!谢谢你。 –

7

嗯......要是有办法扭转深深所有子列表为好....

** **使眼色

4
def deep_reverse(lst): 
    try: 
     if len(lst) > 1: 
      return list(deep_reverse(item) for item in reversed(lst)) 
     return lst 
    except TypeError: 
     return lst 
+1

如果你在那里检查类型,你将不需要异常处理:'return [i if type(i)!= list其他deep_reverse(i)for i in lst [:: - 1]]'。这应该让你在列表中的不同类型中反转。 –

+2

@JeremyPridemore永远不要检查'type',使用'isinstance' – jamylak

+2

使用'reversed'而不是'[:: - 1]' – jamylak

0
def deep_reverse(L): 
    if L == []: 
     return L 
    elif type(L) == int: 
     return L 
    else: 
     return deep_reverse(L[1:]) + [deep_reverse(L[0])] 

>>> print deep_reverse(p) 
[[[[6, 5], 4], 3, 2], 1] 

>>> print deep_reverse(q) 
[[6, 5], 4, [3, 2], 1] 

希望这有助于

+0

使用'isinstance(..)'而不是'type(..)== ..''。 – huon

0
def deep_reverse(ls): 
    for i in ls: 
     if type(i)==list:deep_reverse(i) 
    ls.reverse() 
+2

改用'isinstance' – jamylak

1
>>> def deep_reverse(L): 
     for item in reversed(L): 
      if isinstance(item,list): 
       yield list(deep_reverse(item)) 
      else: 
       yield item 


>>> p = [1, [2, 3, [4, [5, 6]]]] 
>>> q = [1, [2,3], 4, [5,6]] 
>>> list(deep_reverse(p)) 
[[[[6, 5], 4], 3, 2], 1] 
>>> list(deep_reverse(q)) 
[[6, 5], 4, [3, 2], 1] 
0

这里有一个建议:

def deep_reverse(lst): 
    if isinstance(lst ,list): 
     if sum(1 for x in lst if isinstance(x, list)) == 0: 
         lst = lst[::-1] 
         return lst 
     else : 
      lst = lst[::-1] 
      lst = [deep_reverse(item) for item in lst]  
      return lst 
    else: 
     return lst 
1

这里是正确的解决方案

def is_list(p): 
    return isinstance(p, list) 

def deep_reverse(p): 

if p==[]: 
    return p 

if not is_list(p[0]): 
    return deep_reverse(p[1:])+[p[0]] 

else: 
    return deep_reverse(p[1:])+[deep_reverse(p[0])] 
0
def is_list(p): 
    return isinstance(p, list) 

def deep_reverse(p): 

if p==[]: 
    return p 

if not is_list(p): 
    return p 
else: 
    return deep_reverse(p[1:])+[deep_reverse(p[0])] 

测试ok。

0

最优雅:

def deep_reverse(L): 
    """ assumes L is a list of lists whose elements are ints 
    Mutates L such that it reverses its elements and also 
    reverses the order of the int elements in every element of L. 
    It does not return anything. 
    """ 
    # Your code here 
    for i in L: 
     try: 
      deep_reverse(i) 
     except: 
      pass 
    L.reverse()