假设我想要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)
通过适当插入单据,例如通过
<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或.cache由PositionalBindFailover提供)的调用替换.
在第二个示例中,|可以使用前缀运算符而不是slipsub.
最终,您正在以错误的方式构建列表.您可以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。一张长长的清单上的地图可能需要很长时间。
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |