获取Perl中两个字符串列表的交集
在第4章第4.8节(计算唯一列表的并集、交集或差分)中,提供了获取两个整数列表交集的技术:获取Perl中两个字符串列表的交集,perl,Perl,在第4章第4.8节(计算唯一列表的并集、交集或差分)中,提供了获取两个整数列表交集的技术: @a = (1, 3, 5, 6, 7, 8); @b = (2, 3, 5, 7, 9); ... foreach $e (@a, @b) { $union{$e}++ && $isect{$e}++ } @union = keys %union; @isect = keys %isect; 我希望对两个字符串列表执行此操作(不区分大小写)。请问有什么有效的方法吗?是你要找的
@a = (1, 3, 5, 6, 7, 8);
@b = (2, 3, 5, 7, 9);
...
foreach $e (@a, @b) {
$union{$e}++ && $isect{$e}++
}
@union = keys %union;
@isect = keys %isect;
我希望对两个字符串列表执行此操作(不区分大小写)。请问有什么有效的方法吗?是你要找的
use Array::Utils qw(:all);
my @a = qw( a b c d );
my @b = qw( c d e f );
my @isect = intersect(@a, @b);
print join(",",@isect) . "\n";
这将产生
c,d
编辑:我没有注意到您不自觉地想要完成此案例。在这种情况下,您可以将
@a
替换为映射{lc}@a
(同样也可以替换为@b
) 原始溶液所需的最小变化量。只需将字符串的大小写降低
@a = qw( a b c d );
@b = qw( C D E F );
...
foreach $e (@a, @b) {
$union{lc $e}++ && $isect{lc $e}++
}
@union = keys %union;
@isect = keys %isect;
这里有一个
map
/grep
方法:
my @a = qw(Perl PHP Ruby Python C JavaScript);
my @b = qw(erlang java perl python c snobol lisp);
my @intersection =
grep { defined }
@{ { map { lc ,=> $_ } @a } }
{ map { lc } @b };
# @intersection = qw(Perl Python C)
给予
1) 我在某处找到了这个解决方案,但我不记得在哪里。如果有人知道,请告诉我
2) 我不知道这与其他解决方案相比有多高效
3) 老实说,我不知道这是怎么回事。为什么有分号而不是逗号?只是确认一下,cookbook提供的解决方案不适合我的情况,主要是因为字符串的哈希问题,对吗?呃,实际上,没有,您提供的链接中的解决方案工作得很好,除了区分大小写。“你凭什么认为他们不会呢?”李强——绝对不对。烹饪书使用Perl哈希,这些哈希由字符串索引。事实上,示例中的整数在用作哈希键时会隐式转换为字符串@b=()代码>
@a = qw(a B c d);
@b = qw(b c D e f);
@c = grep { $f = lc $_; grep lc $_ eq $f, @b } @a;
B c d