【问题标题】:Can I flatten a list using recursive function and list comprehension?我可以使用递归函数和列表理解来展平列表吗?
【发布时间】:2018-10-12 02:56:51
【问题描述】:

这只是概念的自学,可能没有实际用途

我的问题是

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

  2. 如果1是可能的,我只能使用列表推导+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]]]

【问题讨论】:

  • @dawg 不确定这是一个很好的副本,因为它只有一层深,itertools.chain.from_iterable() 是一个简单的解决方案。我不会怀疑可能有更合适的副本。
  • @AChampion 你是对的
  • Flatten an irregular list of lists 有很多很好的解决方案,但并不特定于使用递归列表推导。
  • 然后将this 视为一个副本
  • this 复制...

标签: python list recursion list-comprehension


【解决方案1】:

虽然有点奇怪,但你可以:

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]

【讨论】:

  • 我不相信我这样做了,因为这是递归的,你的例子是不同层次的深度。
  • 我想说第二个例子最接近我的预期。但你是对的,它一点也不优雅。
  • 这是一个y-combinator。没有更简单的方法来定义匿名递归函数,但是当您可以添加变量名称时,这在 python 中是微不足道的,例如:fun_d = lambda x: [i for e in x for i in (fun_d(e) if isinstance(e,list) else [e])]; fun_d(lis)
  • @anu 您使用的是元组而不是列表,正如我提到的测试 typing.Sequence 而不是 list 以获得更通用的解决方案,例如from typing import Sequence 然后... isinstance(e, Sequence) ...
  • 字符串会给Sequence 带来问题,因为它们被认为是一个序列,甚至是单个字符串,因此您需要防范字符串,例如if isinstance(e, Sequence) and not isinstance(e, str) 如果您使用 bytes,您会遇到同样的问题。
猜你喜欢
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 2021-10-20
  • 2018-01-30
  • 2012-09-10
  • 1970-01-01
相关资源
最近更新 更多