从perl中的列表生成无序对
Generate unordered pairs from list in perl
这里是 Perl 新手。
我想遍历来自单词列表的单词对:
@words = ("word1", "word2", "word3", "word4");
我想创建和处理所有词对,但是词对的顺序并不重要,即词对
("word1", "word2")
和 ("word2, "word1")
被认为是相同的,应该只生成其中一个。
有没有简单的方法来做到这一点?明显的解决方案是有一个嵌套循环有点像:
for my $i1 (0 ... $#words) {
for my $i2 ($i1 + 1 ... $#words) {
process_pair(words[$i1], words[$i2])
}
}
但我正在寻找比这更像 Perl 的东西。提前致谢。
对于固定的R=2,你给出的方案是很合适的。
for my $i1 (0 ... $#words) {
for my $i2 ($i1 + 1 ... $#words) {
process_pair($words[$i1], $words[$i2])
}
}
但是如果 R 更大或可变怎么办?您可以使用 NestedLoops
.
做一些强大的事情
use Algorithm::Loops qw( NestedLoops );
my $R = 2;
NestedLoops(
[ [ 0..$#words ],
( sub { [$_+1..$#words] } ) x ($R-1),
],
\&process_pair,
);
或作为迭代器
use Algorithm::Loops qw( NestedLoops );
my $R = 2;
my $iter = NestedLoops([
[ 0..$#words ],
( sub { [$_+1..$#words] } ) x ($R-1),
]);
while (my @combo = $iter->()) {
process_pair(@combo);
}
但这很难读。专门解决此问题的解决方案将是最干净的。
use Math::Combinatorics qw( );
my $R = 2;
my $iter = Math::Combinatorics->new( count => $R, data => \@words );
while (my @combo = $iter->next_combination) {
process_pair(@combo);
}
这里是 Perl 新手。
我想遍历来自单词列表的单词对:
@words = ("word1", "word2", "word3", "word4");
我想创建和处理所有词对,但是词对的顺序并不重要,即词对
("word1", "word2")
和 ("word2, "word1")
被认为是相同的,应该只生成其中一个。
有没有简单的方法来做到这一点?明显的解决方案是有一个嵌套循环有点像:
for my $i1 (0 ... $#words) {
for my $i2 ($i1 + 1 ... $#words) {
process_pair(words[$i1], words[$i2])
}
}
但我正在寻找比这更像 Perl 的东西。提前致谢。
对于固定的R=2,你给出的方案是很合适的。
for my $i1 (0 ... $#words) {
for my $i2 ($i1 + 1 ... $#words) {
process_pair($words[$i1], $words[$i2])
}
}
但是如果 R 更大或可变怎么办?您可以使用 NestedLoops
.
use Algorithm::Loops qw( NestedLoops );
my $R = 2;
NestedLoops(
[ [ 0..$#words ],
( sub { [$_+1..$#words] } ) x ($R-1),
],
\&process_pair,
);
或作为迭代器
use Algorithm::Loops qw( NestedLoops );
my $R = 2;
my $iter = NestedLoops([
[ 0..$#words ],
( sub { [$_+1..$#words] } ) x ($R-1),
]);
while (my @combo = $iter->()) {
process_pair(@combo);
}
但这很难读。专门解决此问题的解决方案将是最干净的。
use Math::Combinatorics qw( );
my $R = 2;
my $iter = Math::Combinatorics->new( count => $R, data => \@words );
while (my @combo = $iter->next_combination) {
process_pair(@combo);
}