数组A中不在数组B中的项

时间:2018-08-21 02:43:19

标签: arrays perl

确定数组A中不在数组B中的项目的快速方法是什么?

到目前为止,我有以下内容,但是可以一行完成吗?

for $aname (@anames)
{
   if (not grep { $_ eq $aname } @hrefs)
   {
        push @anamesremove, $aname;
   }
}

2 个答案:

答案 0 :(得分:3)

如果您知道哪个数组包含另一个数组

my @small  = 10..12;
my @large  = 10..15;

my %ref = map { $_ => 1 } @small;

my @diff = grep { not exists $ref{$_} } @large;

行数不多,但效率很高。

如果不知道其中包含另一个,则必须双向进行。

然后有各种用于阵列/列表操作的模块可以提供帮助。

对于其中一个,List::Compare中的get_complement确实满足了需求。


您可以使用List::Util

在一个语句中完成所有操作
use List::Util qw(none);

my @diff = grep { my $e = $_; none { $e eq $_ } @small } @large; 

但这具有 O(NM-M 2 / 2)复杂度,其中 N (大)和 M (小)是数组大小。

答案 1 :(得分:0)

不是一个班轮,但是在大型阵列上这可能比您快:

#!/usr/bin/perl
use warnings;
use 5.012;

sub difference {
    my ($first, $second) = @_;
    my %except;
    @except{ @$second } = 1;
    return [ grep { not exists $except{$_} } @$first ];
}

my @anames = ("one", "two", "three", "four", "five");
my @hrefs = ("two", "four", "six");

my $d = difference \@anames, \@hrefs;
say "@$d";