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 に答える