确定数组A中不在数组B中的项目的快速方法是什么?
到目前为止,我有以下内容,但是可以一行完成吗?
for $aname (@anames)
{
if (not grep { $_ eq $aname } @hrefs)
{
push @anamesremove, $aname;
}
}
答案 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";