Можно ли сгладить список с помощью рекурсивной функции и понимания списка? - PullRequest
0 голосов
/ 02 мая 2018

Это только для самостоятельного изучения концепции и может не иметь практического применения

Мой вопрос

  1. можно ли использовать только рекурсивную функцию и понимание списка, чтобы сгладить неизвестный уровень вложенного списка?

  2. Если 1 возможно, могу ли я использовать только списки + лямбда-функции для достижения той же цели?

Пока это все, что я могу получить, но, похоже, это не работает.

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 голосов
/ 02 мая 2018

Вы можете, хотя это немного странно:

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 вы можете использовать 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]
...