【发布时间】:2017-03-31 19:06:56
【问题描述】:
我有一个数字列表L。还有另一个数字列表M。我需要返回 L 和 M 中找到的数字列表 L'。
编辑:数学上,我正在寻找Multiset 交点。
例子:
L = 3,
1, 4,1, 5,9,2, 6
M =9, 7,1,2,1, 1
L' = 9, 1, 2, 1
为此我写了following code:
my @some-numbers = 3, 1, 4, 1, 5, 9, 2, 6;
my @to-match = 9, 7, 1, 2, 1, 1;
my @matched;
my %histogram;
for @some-numbers -> $n { %histogram{$n}++ };
for @to-match -> $n {
next if not defined %histogram{$n};
if %histogram{$n} > 0 {
push @matched, $n;
%histogram{$n}--;
}
};
say @matched;
虽然它达到了目的,但我想知道是否有 惯用的 Perl6 方法可以做到这一点?
一些背景知识:我一直在尝试一起学习 Perl6 和 Python,并用这两种语言解决相同的难题。 Python 为上述问题提供了一个特别的pleasing solution。至少在我的初学者眼中:)
【问题讨论】:
-
为什么
1在L'中出现了两个,而不是三个? -
在 Perl5 中你可以做
my %seen = map { $_ => 1 } @to_match; my @match = grep { exists $seen{$_} } @some_numbers -
很抱歉没有准确地提出问题。我现在意识到我正在寻找的是Multisetintersection。我已经编辑了问题陈述以反映这一点。谢谢:)
标签: raku