Flattening a list recursively
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Flatten (an irregular) list of lists in Python
号
我无法使用python递归地展平列表。我见过许多需要列表理解的方法和需要导入的各种方法,但是我正在寻找一种非常基本的方法来递归地展平一个不使用任何for循环的不同深度的列表。我做了一系列的测试,但是有两个我不能通过
1 2 | flatten([[[[]]], [], [[]], [[], []]]) # empty multidimensional list flatten([[1], [2, 3], [4, [5, [6, [7, [8]]]]]]) # multiple nested list |
我的代码
1 2 3 4 5 6 7 8 9 10 | 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:]) |
号
我希望能得到一些建议。
这两种情况都可以处理,我认为可以解决一般情况,而不需要任何for循环:
1 2 3 4 5 6 | 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:]) |
1 2 3 | li=[[1,[[2]],[[[3]]]],[['4'],{5:5}]] flatten=lambda l: sum(map(flatten,l),[]) if isinstance(l,list) else [l] print flatten(li) |
好吧,如果你想用口齿不清的方式,就让我们来吧。
1 2 3 4 5 6 7 | 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)])) |
这里有一个没有任何循环或列表理解的可能解决方案,只使用递归:
1 2 3 4 5 6 7 8 | 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] |