递归地展平列表

Ant*_*ugh 10 python recursion nested list

可能重复:
在Python中展平(不规则)列表

我无法使用python以递归方式展平列表.我已经看到了许多需要列表理解的方法和需要导入的各种方法但是我正在寻找一种非常基本的方法来递归地展平不使用任何for循环的不同深度的列表.我进行了一系列测试,但有两个我无法通过

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

我的代码

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:])
Run Code Online (Sandbox Code Playgroud)

我很感激一些建议.

Mu *_*ind 28

这可以处理你的两种情况,我认为将解决一般情况,没有任何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:])
Run Code Online (Sandbox Code Playgroud)


chy*_*nog 14

li=[[1,[[2]],[[[3]]]],[['4'],{5:5}]]
flatten=lambda l: sum(map(flatten,l),[]) if isinstance(l,list) else [l]
print flatten(li)
Run Code Online (Sandbox Code Playgroud)


tob*_*s_k 5

这是一个可能的解决方案,没有任何循环或列表推导,只使用递归:

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]
Run Code Online (Sandbox Code Playgroud)

  • 考虑到问题中的要求(没有循环),这是一个很好的答案,但值得注意的是,性能将非常糟糕.Python的`list`类型不是链表,而是类似于数组的类.每次在递归步骤"flatten(first)+ flatten(rest)"中加入两个列表时,代码将复制两个列表的所有内容.我认为将花费O(N ^ 2)时间来生成长度为N的输出列表. (2认同)

geo*_*org 5

好吧,如果你想要一个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)]))
Run Code Online (Sandbox Code Playgroud)

  • 大声笑,我喜欢你如何改变最后一点从'flatten(x [0])+ flatten(x [1:])`到`cons(*map(flatten,[car(x),cdr(x)]) )`.你可以为旧时添加一些括号吗? (2认同)