如何"压缩"perl 6中的列表列表?

msc*_*cha 12 perl6 raku

假设我想要a,b和c中的2个字母的所有排列.

我可以:

my @perm = <a b c>.combinations(2)».permutations;
say @perm;
# [((a b) (b a)) ((a c) (c a)) ((b c) (c b))]
Run Code Online (Sandbox Code Playgroud)

这很接近,但不完全是我需要的.我如何"扁平化"这样以便得到:

# [(a b) (b a) (a c) (c a) (b c) (c b)]
Run Code Online (Sandbox Code Playgroud)

rai*_*iph 14

另请参阅"实现我(OP)想要的更好方法".

另请参阅"一些可能的解决方案"回答"如何完全展平Perl 6列表(列表(列表)...)"问题.

添加下标

my \perm = <a b c>.combinations(2)».permutations;
say perm;       # (((a b) (b a)) ((a c) (c a)) ((b c) (c b)))
say perm[*];    # (((a b) (b a)) ((a c) (c a)) ((b c) (c b)))
say perm[*;*];  # ((a b) (b a) (a c) (c a) (b c) (c b))
say perm[*;*;*] # (a b b a a c c a b c c b)
Run Code Online (Sandbox Code Playgroud)

笔记

我使用了一个非sigil变量,因为我觉得那些不了解Perl 6的人会更清楚一些.

我没有将下标附加到原始表达式,但我可以:

my \perm = <a b c>.combinations(2)».permutations[*;*];
say perm;       # ((a b) (b a) (a c) (c a) (b c) (c b))
Run Code Online (Sandbox Code Playgroud)


Chr*_*oph 9

通过适当插入单据,例如通过

<a b c>.combinations(2).map(*.permutations.Slip).Array
Run Code Online (Sandbox Code Playgroud)

要么

[ slip .permutations for <a b c>.combinations(2) ]
Run Code Online (Sandbox Code Playgroud)

.Array如果你对a很好,那么调用第一个例子是不必要的Seq,并且如果不需要可变性,可以用对(.list.cachePositionalBindFailover提供)的调用替换.

在第二个示例中,|可以使用前缀运算符而不是slipsub.


Jos*_*hua 9

最终,您正在以错误的方式构建列表.您可以slip将这些排列放入外部列表中.

<a b c>.combinations(2).map(|*.permutations);
Run Code Online (Sandbox Code Playgroud)

产生以下列表

((a b) (b a) (a c) (c a) (b c) (c b)) 
Run Code Online (Sandbox Code Playgroud)

根据Bench模块,这比做起来快300%

<a b c>.combinations(2).map(*.permutations)[*;*]
Run Code Online (Sandbox Code Playgroud)


小智 5

my @perm = <a b c>.combinations(2)».permutations;
dd [ @perm.map(*.Slip) ]
# OUTPUT«[("a", "b"), ("b", "a"), ("a", "c"), ("c", "a"), ("b", "c"), ("c", "b")]?»
Run Code Online (Sandbox Code Playgroud)

但是,当您稍后在程序中使用它时,您最好解构 LoL。一张长长的清单上的地图可能需要很长时间。