Мне было интересно, как я могу полностью сгладить списки и вещи, которые их содержат. Среди прочего, я придумал это решение, которое проскальзывает вещи, которые имеют более одного элемента, и откладывает их назад, или принимает вещи с одним элементом после его проскальзывания.
Это немного отличается от Как "сгладить" список списков в perl 6?, который не является полностью плоским, потому что задача заключается в реструктуризации,
Но, может быть, лучший способ.
my @a = 'a', ('b', 'c' );
my @b = ('d',), 'e', 'f', @a;
my @c = 'x', $( 'y', 'z' ), 'w';
my @ab = @a, @b, @c;
say "ab: ", @ab;
my @f = @ab;
@f = gather {
while @f {
@f[0].elems == 1 ??
take @f.shift.Slip
!!
@f.unshift( @f.shift.Slip )
}
}
say "f: ", @f;
Это дает:
ab: [[a (b c)] [(d) e f [a (b c)]] [x (y z) w]]
f: [a b c d e f a b c x y z w]
Любопытно, что я также прочитал несколько ответов на python:
- Создание плоского списка из списка списков в Python
- Как сгладить список списков на один шаг
- сгруппировать список списков списков в список списков
itertools.chain(*sublist)
выглядят интересными, но ответы были либо рекурсивными, либо ограниченными двумя уровнями от жесткого кодирования. Функциональные языки были рекурсивными в исходном коде, но я ожидал этого.