加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl6:将列表中的元素与另一个列表匹配

发布时间:2020-12-15 21:48:59 所属栏目:大数据 来源:网络整理
导读:我有一个数字列表L.还有另一个数字列表M.我需要返回L和M中的数字列表L’. 编辑:数学上,我正在寻找Multiset交叉口. 例: L = 3, 1 ,4,5, 9 , 2 ,6 M = 9 ,7,1 L’ = 9,1,2,1 我为此写了following code: my @some-numbers = 3,9,6;my @to-match = 9,1;my @ma
我有一个数字列表L.还有另一个数字列表M.我需要返回L和M中的数字列表L’.

编辑:数学上,我正在寻找Multiset交叉口.

例:

L = 3,1,4,5,9,2,6
M = 9,7,1
L’ = 9,1,2,1

我为此写了following code:

my @some-numbers = 3,9,6;
my @to-match     = 9,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.至少对我的初学者来说:)

解决方法

根据您正在寻找的精确语义,Bag操作可能只是票证:
my L = 3,6;
my M = 9,1;

.put with L.Bag ∩ M.Bag;

显示:

9 1(2) 2

这是包含三个键’9′,’1’和’2’的Bag的字符串化,其各自的值(重复计数)是整数1,2和1.

要让Perl 6从包中生成一个列表,每个键重复其关联值指示的次数,请使用.kxxv方法:

.kxxv.put with L.Bag ∩ M.Bag;

显示:

9 1 1 2

(kxxv方法的助记符是它的k为“key”,然后xx与xx重复运算符类似,最后v为“value”.如果你考虑它,它有意义.)

但也许一袋不会.例如,结果中元素的顺序可能很重要 – 你需要9 1 2 1而不是9 1 1 2?如果包包不是正确的方法,我会延长这个答案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读