xx
是列表重復操作符, 用于將一個列表重復指定的次數(shù)。xx
不會展平列表中的元素。
$ perl6
> my @n = <1 2 3>;
[1 2 3]
> my $n = 4;
4
> my @c = @n xx $n
輸出:
[[1 2 3] [1 2 3] [1 2 3] [1 2 3]]
現(xiàn)在我想要長度為 $n
的一堆列表的所有排列(combinations):
> ( [X] ( @n xx $n ) )
((1 1 1 1) (1 1 1 2) (1 1 1 3) (1 1 2 1) (1 1 2 2) (1 1 2 3)
(1 1 3 1) (1 1 3 2) (1 1 3 3) (1 2 1 1) (1 2 1 2) (1 2 1 3)
(1 2 2 1) (1 2 2 2) (1 2 2 3) (1 2 3 1) (1 2 3 2) (1 2 3 3)
(1 3 1 1) (1 3 1 2) (1 3 1 3) (1 3 2 1) (1 3 2 2) (1 3 2 3)
(1 3 3 1) (1 3 3 2) (1 3 3 3) (2 1 1 1) (2 1 1 2) (2 1 1 3)
(2 1 2 1) (2 1 2 2) (2 1 2 3) (2 1 3 1) (2 1 3 2) (2 1 3 3)
(2 2 1 1) (2 2 1 2) (2 2 1 3) (2 2 2 1) (2 2 2 2) (2 2 2 3)
(2 2 3 1) (2 2 3 2) (2 2 3 3) (2 3 1 1) (2 3 1 2) (2 3 1 3)
(2 3 2 1) (2 3 2 2) (2 3 2 3) (2 3 3 1) (2 3 3 2) (2 3 3 3)
(3 1 1 1) (3 1 1 2) (3 1 1 3) (3 1 2 1) (3 1 2 2) (3 1 2 3)
(3 1 3 1) (3 1 3 2) (3 1 3 3) (3 2 1 1) (3 2 1 2) (3 2 1 3)
(3 2 2 1) (3 2 2 2) (3 2 2 3) (3 2 3 1) (3 2 3 2) (3 2 3 3)
(3 3 1 1) (3 3 1 2) (3 3 1 3) (3 3 2 1) (3 3 2 2) (3 3 2 3)
(3 3 3 1) (3 3 3 2) (3 3 3 3))
注意,排列是不一樣的殷费,它更簡單,因為有一個方法來生成排列:
> @n.permutations
((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1))
我們來一步一步分解上面那個排列的例子:
首先械哟,要有一個列表:
> (1, 2, 3)
( 1 2 3)
現(xiàn)在我想重復這個列表:
> (1, 2, 3) xx 2
((1 2 3) (1 2 3))
插一句, 如果你不喜歡這種格式,你可以使用 |
來“解容器化”這個小列表殿雪,以使它失去結(jié)構(gòu):
> |(1, 2, 3) xx 2
(1 2 3 1 2 3)
然而我想保留列表結(jié)構(gòu)暇咆,以使我能組合兩個列表的拷貝。下一步就是交叉:
> (1, 2, 3) X ( 1, 2, 3 )
((1 1) (1 2) (1 3) (2 1) (2 2) (2 3) (3 1) (3 2) (3 3))
現(xiàn)在使用兩個列表來做 reduction, 得到同樣的結(jié)果:
> [X] (1, 2, 3), (1, 2, 3)
((1 1) (1 2) (1 3) (2 1) (2 2) (2 3) (3 1) (3 2) (3 3))
記住: [OP]
element1, element2, element3... 等價于:
element1 OP element2 OP element3 OP ...
我可以對這些列表應用工具函數(shù)丙曙,我可以grep
過濾那些:
> ( [X] @n xx 5 ).grep( { .sum > 13 } )
((2 3 3 3 3) (3 2 3 3 3) (3 3 2 3 3) (3 3 3 2 3) (3 3 3 3 2) (3 3 3 3 3))
但是我還可以做的更好爸业!我想分割那個大數(shù)據(jù)集。我能調(diào)用 categorize
方法亏镰。三元操作符返回的字符串就是對應項所屬的散列鍵扯旷。我得到了一個散列,每個鍵擁有一個關(guān)聯(lián)該鍵的數(shù)組:
> ( [X] @n xx 5 ).categorize( { .sum > 13 ?? 'pass' !! 'fail' } )
{fail => [(1 1 1 1 1) ... (3 3 3 3 1)], pass => [(2 3 3 3 3) (3 2 3 3 3) (3 3 2 3 3) (3 3 3 2 3) (3 3 3 3 2) (3 3 3 3 3)]}
multi sub categorize(&mapper, *@values --> Hash:D)
multi method categorize(List:D: &mapper --> Hash:D)
根據(jù)映射器將值列表轉(zhuǎn)換為表示這些「值的分類」的散列; 每個散列鍵表示一個可能的分類索抓,并且相應的散列值包含由映射器分類到相關(guān)聯(lián)的鍵的類別中的那些列表值的數(shù)組钧忽。
請注意毯炮,與classify假定 mapper 的返回值是單個值不同,classificationize 總是假定 mapper 的返回值是適合當前值的類別列表耸黑。
例子:
sub mapper(Int $i) returns List {
$i %% 2 ?? 'even' !! 'odd',
$i.is-prime ?? 'prime' !! 'not prime'
}
say categorize &mapper, (1, 7, 6, 3, 2); # {even => [6 2], not prime => [1 6],
# odd => [1 7 3], prime => [7 3 2]}