18

重複の可能性:
Pythonのリストの(不規則な)リストをフラット化する

Pythonを使用してリストを再帰的にフラット化するのに問題があります。リスト内包表記を必要とする多くのメソッドとインポートを必要とするさまざまなメソッドを見てきましたが、forループも使用しないさまざまな深さのリストを再帰的にフラット化する非常に基本的なメソッドを探しています。一連のテストを受けましたが、合格できないものが2つあります

flatten([[[[]]], [], [[]], [[], []]]) # empty multidimensional list
flatten([[1], [2, 3], [4, [5, [6, [7, [8]]]]]]) # multiple nested list

私のコード

def flatten(test_list):
    #define base case to exit recursive method
    if len(test_list) == 0:
       return []
    elif isinstance(test_list,list) and type(test_list[0]) in [int,str]:
        return [test_list[0]] + flatten(test_list[1:])
    elif isinstance(test_list,list) and isinstance(test_list[0],list):
        return test_list[0] + flatten(test_list[1:])
    else:
        return flatten(test_list[1:])

アドバイスをいただければ幸いです。

4

4 に答える 4

39

これはあなたの両方のケースを処理し、 for ループなしで一般的なケースを解決すると思います:

def flatten(S):
    if S == []:
        return S
    if isinstance(S[0], list):
        return flatten(S[0]) + flatten(S[1:])
    return S[:1] + flatten(S[1:])
于 2012-09-18T07:48:30.857 に答える
23
li=[[1,[[2]],[[[3]]]],[['4'],{5:5}]]
flatten=lambda l: sum(map(flatten,l),[]) if isinstance(l,list) else [l]
print flatten(li)
于 2012-09-18T09:34:39.880 に答える
7

Here's a possible solution without any loops or list comprehensions, just using recursion:

def flatten(test_list):
    if isinstance(test_list, list):
        if len(test_list) == 0:
            return []
        first, rest = test_list[0], test_list[1:]
        return flatten(first) + flatten(rest)
    else:
        return [test_list]
于 2012-09-18T07:41:20.660 に答える
7

まあ、Lisp の方法が必要な場合は、それを使用しましょう。

atom = lambda x: not isinstance(x, list)
nil  = lambda x: not x
car  = lambda x: x[0]
cdr  = lambda x: x[1:]
cons = lambda x, y: x + y

flatten = lambda x: [x] if atom(x) else x if nil(x) else cons(*map(flatten, [car(x), cdr(x)]))
于 2012-09-18T07:59:37.067 に答える