【问题标题】:Perl Array sum similar elements [closed]Perl数组对相似元素求和[关闭]
【发布时间】:2013-09-12 03:25:37
【问题描述】:

我有一个由字符串和数字组成的数组。我想对那些具有相似字符串值的数字求和。请帮忙!!

文件:

aggr3 350.01000213623
aggr3 1228.79999923706
aggr5 250
aggr3 1536
aggr3 690.01000213623
aggr3 1587.20000076294
aggr9 550.01000213623
aggr3 1228
aggr5 905
aggr5 100

需要的输出

aggr3 5391
aggr5 1255
aggr9 550

【问题讨论】:

    标签: arrays perl hash key duplicates


    【解决方案1】:

    也许像这样?

    use strict;
    use warnings;
    
    my @data = <DATA>;
    my %data;
    $data{$_->[0]} += $_->[1] for map [ split ], @data;
    
    print "$_ $data{$_}\n" for sort keys %data;
    
    __DATA__
    aggr3 350.01000213623
    aggr3 1228.79999923706
    aggr5 250
    aggr3 1536
    aggr3 690.01000213623
    aggr3 1587.20000076294
    aggr9 550.01000213623
    aggr3 1228
    aggr5 905
    aggr5 100
    

    输出

    aggr3 6620.02000427246
    aggr5 1255
    aggr9 550.01000213623
    

    【讨论】:

    • +1 表示收集单行。 ) 我几乎忘记了 Perl 的简洁程度。
    • 你唯一缺少的印记是*data,否则脚本将是一个很好的测试一个人对perlreftut的理解:)
    • @mpapec:问题是,“我有一个array,它由字符串和数字组成”
    【解决方案2】:

    通常,如果你想在 Perl 中对一些数据进行分组,你use hashes。这些散列的键对应于分组标准,值用作累加器(它可以是一个简单的数字,如本例所示,也可以是等待稍后处理的数字数组)。

    这是一种方法:

    use warnings;
    use strict;
    
    # this hash will hold all the cumulatives
    my %sums;
    
    # here we scan the source, line by line
    # each line is split to key and value
    while (<DATA>) {
      chomp;
      my ($label, $value) = split;
    
      # this line uses the auto-vivification Perl feature:
      # if there's no corresponding item in %sums hash, it'll be created (with 0 value)
      $sums{$label} += $value;
    }
    
    # here we process the resulting hash:
    for my $key (sort keys %sums) {
      print $key, ' ', $sums{$key}, "\n";
    }
    __DATA__
    aggr3 350.01000213623
    aggr3 1228.79999923706
    aggr5 250
    aggr3 1536
    aggr3 690.01000213623
    aggr3 1587.20000076294
    aggr9 550.01000213623
    aggr3 1228
    aggr5 905
    aggr5 100
    

    Codepad demo.

    【讨论】:

    • 这是单行版本:perl -nalwe '$a{$F[0]} += $F[1]; }{ print "$_ $a{$_}" for keys %a'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2020-12-31
    • 2014-08-18
    相关资源
    最近更新 更多