【问题标题】:perl: count unique elements in arrayperl:计算数组中的唯一元素
【发布时间】:2012-04-28 22:35:33
【问题描述】:

我有一个包含名称的简单数组,我希望能够轻松打印出每个名称出现的次数。

我尝试制作大量的 for 循环和差异语句,以首先制作另一个具有唯一值的数组,然后尝试计算 orinal 数组中的值并将它们存储在第三个数组中。这似乎过于复杂,我想看看是否有更简单的方法来做到这一点。

【问题讨论】:

    标签: arrays perl counting


    【解决方案1】:

    使用哈希计算每个名称出现的次数:

    use warnings;
    use strict;
    use Data::Dumper;
    $Data::Dumper::Sortkeys=1;
    
    my @names = qw(bob mike joe bob);
    my %counts;
    $counts{$_}++ for @names;
    print Dumper(\%counts);
    
    __END__
    
    $VAR1 = {
              'bob' => 2,
              'joe' => 1,
              'mike' => 1
            };
    

    【讨论】:

      【解决方案2】:

      最简单的方法是利用哈希。

      my @names = qw/joe bob sue bob mike sally mike bob sally dale joe/;
      my %counts;
      $counts{$_}++ for @names;
      

      这会给你一个看起来像这样的哈希:

            'dale' => 1,
            'sue' => 1,
            'joe' => 2,
            'mike' => 2,
            'bob' => 3,
            'sally' => 2
      

      【讨论】:

        【解决方案3】:
        my %counts;
        ++$counts{$_} for @names;
        my @unique = keys(%counts);
        

        可以缩短为

        my %counts;
        my @unique = grep !$counts{$_}++, @names;
        

        前者失去了名称的顺序,而后者具有保留顺序的优点。 (它保留第一个重复项。)

        后者也是获取列表唯一成员的惯用方式。通常,计数只是一个副作用,但在这种情况下,它是一个理想的产品。 :)

        【讨论】:

        • 谢谢,在我的情况下订单无关紧要,但我将来可能需要这个
        猜你喜欢
        • 2020-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-18
        • 1970-01-01
        • 2015-04-17
        • 1970-01-01
        • 2010-10-26
        相关资源
        最近更新 更多