【问题标题】:Get the intersection of two lists of strings in Perl在 Perl 中获取两个字符串列表的交集
【发布时间】:2020-01-17 01:42:30
【问题描述】:

在第 4 章第 4.8 节(计算唯一列表的并集、交集或差集)中,Perl Cookbook 提供了这种获取两个整数列表交集的技术:

@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;

我希望对两个字符串列表执行此操作(不区分大小写)。请问有什么有效的方法吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    Array::Utils 是你要找的。​​p>

    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 替换为map{lc}@a(同样也可以替换为@b)。

    【讨论】:

    • 只是为了确认一下,cookbook 提供的解决方案不适合我的情况,主要是由于字符串的哈希问题,对吗?
    • 呃,实际上,不,您提供的链接中的解决方案工作得很好,除了区分大小写。是什么让您认为他们不会?
    • @Qiang Li - 绝对不正确。这本食谱使用 Perl 哈希,由字符串索引。实际上,示例中的整数在用作哈希键时会隐式转换为字符串。
    【解决方案2】:

    这是一种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)
    

    【讨论】:

      【解决方案3】:

      原始解决方案所需的更改最少。只是小写的字符串。

      @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;
      

      【讨论】:

      • @a=qw(a b c A B C); @b=(); 上失败
      【解决方案4】:
      @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
      

      1) 我在某个地方找到了这个解决方案,但我不记得在哪里。如果有人知道,请告诉我。

      2) 我不知道这与其他解决方案相比效率如何。

      3) 老实说,我不知道这是如何工作的。为什么有分号而不是逗号?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        • 2017-09-13
        相关资源
        最近更新 更多