perl - 数组中包含重复条目的数学

时间:2017-02-21 20:01:38

标签: perl

我有两个数组:

my @name = (bob, bob, dave, john, john, mary, mary, mary);
my @cost = (5, 7, 4, 4, 4, 6, 3 , 4);

我想将它们映射在一起,所以输出就是:

bob 12
dave 4
john 8
mary 13

数组的变化虽然所以我不能使用引用。如何按@cost@name进行分组,并添加@cost的值?

4 个答案:

答案 0 :(得分:6)

将消耗输入的更多的代码:

my %Cost_by_Name;
while (@name & @cost) {
    $Cost_by_Name{shift @name} += shift @cost;
}

..因为源数据不值得活着。

答案 1 :(得分:4)

一些map诡计:

my %hash;
%hash = map {$name[$_] => $hash{$name[$_]} += $cost[$_]} 0..$#name;

就个人而言,我会选择for()while()循环解决方案,因为一眼就能看到发生的事情要容易得多。

答案 2 :(得分:3)

我会尝试这样的事情。

#!/usr/bin/perl 
use strict; use warnings; use Data::Dumper;
my @name = qw(bob bob dave john john mary mary mary);
my @cost = qw(5 7 4 4 4 6 3 4);
my %seen = ();
foreach(0..scalar(@name)-1){
    if (!exists $seen{$name[$_]}){
        $seen{$name[$_]} = $cost[$_];
    }
    else{
        my $sum = 0;
        $sum = $seen{$name[$_]};
        my $new = $sum + $cost[$_];
        $seen{$name[$_]} = $new;
    }
}
print Dumper(\%seen);

<强>输出:

$VAR1 = {
    'bob' => 12,
    'john' => 8,
    'dave' => 4,
    'mary' => 13
};

答案 3 :(得分:2)

这样的事情应该有效:

$this->load->database();
$this->load->dbutil();

// check connection details
if( !$this->dbutil->database_exists('myDatabase'))
    echo 'Not connected to a database, or database not exists';

然后你只需循环遍历数组即可获得总费用:

my %myHash = ();
for (my $i=0 ; $i<$#name ; $i++) {
    $myHash{$name[$i]} += $cost[$i];
}