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

xap*_*ppp -1 python recursion list-comprehension list

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

我的问题是

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

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

到目前为止,这一切我都可以得到,但似乎无法正常工作.

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

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

您可能希望使用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])]
Run Code Online (Sandbox Code Playgroud)

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

  • 我不相信我这样做,因为这是递归的,你的例子是不同程度的深度. (3认同)