我可以使用递归函数和列表推导来展平列表吗?

时间:2018-05-02 04:28:51

标签: python list recursion list-comprehension

这仅适用于概念的自学习,可能没有实际用途

我的问题是

  1. 我可以只使用递归函数和列表推导来展平未知级别的嵌套列表吗?

  2. 如果可以1,我可以只使用list comprehension + lambda函数来达到同样的目的吗?

  3. 到目前为止,这一切都可以得到,但似乎无效。

    l=[1,[2,3],[4,5,[6,7,8,9]]] # assuming unknown level of nesting
    
    def fun_d(x):
        return [fun_d(e) if isinstance(e,list) else e for e in x]
    
    fun_d(l)
    
    Out[25]: [1, [2, 3], [4, 5, [6, 7, 8, 9]]]
    

1 个答案:

答案 0 :(得分:7)

你可以这有点奇怪:

def fun_d(x):
    return [i for e in x for i in (fun_d(e) if isinstance(e,list) else [e])]

In[] :
l=[1,[2,3],[4,5,[6,7,8,9]]]
fun_d(l)

Out[]:
[1, 2, 3, 4, 5, 6, 7, 8, 9]

您可能希望使用Sequence而不是list,因此其他类型的序列也会被展平。

from typing import Sequence

def fun_d(x):
    return [i for e in x for i in (fun_d(e) if isinstance(e, Sequence) and not isinstance(e, str) else [e])]

命名的lambda是微不足道的,对于真正的匿名lambda,您可以使用y-combinator

只是为了表明这是多么荒谬,一个匿名的递归lambda

In []:
lis = [1,[2,3],[4,5,[6,[7,8],9]]]
(lambda f: f(f))(lambda f: (lambda fun_d: lambda x: [i for e in x for i in (fun_d(e) if isinstance(e, list) else [e])])(lambda x: f(f)(x)))(lis)

Out[]:
[1, 2, 3, 4, 5, 6, 7, 8, 9]