我在思考如何完全展平包含列表的东西。除其他事项外,我想出了这个解决方案,可以将具有多个元素的东西压缩并放回去,或者在滑动后获取具有一个元素的东西。
这与如何在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的回答:
itertools.chain(*sublist)
看起来很有趣,但回答要么采用递归,要么限制为硬编码的两个层级。函数式语言在源代码中使用递归,但这是我预料到的。
deepflat
函数(或运算符,如果还没有被使用,我提名||
)? - mschasay gather @ab.deepmap: *.take;
。 - raiph@ab[**]
,可能就不需要另一个运算符了。|
将某些内容插入到外部列表中,它不会影响应用于内部结构的列表-因此我认为||
不是理想的选择。此外,我认为其中一个设计文档已经将||
标记为将列表转换为多维下标的方法,例如@tree [||@path]
。 - smls