我知道如何以漫长的方式做到这一点,但我想知道是否有一种简单的方法可以将一系列数字拆分成桶。
我有一系列将两个数字联系在一起的数据:
频率值
我想将这些值分解为频率的子部分,然后得到每个跨度成员的平均值和标准偏差,即0.05的频率结果。
所以我想要的是一系列数组,其中包含与频率相关的值。
我啰嗦的方法是
%results = ();
$key = int( ( $frequency * 100 ) / 20 );
if ( !exists( $results{$key} ) ) {
@temp = ($value);
$results{$key} = @temp;
} else {
$results{$key} = push( $results{$key}, $value );
}
有没有办法简化这个?
答案 0 :(得分:3)
看起来你真的想要一个Hash of Arrays。
因此您需要push
:
push @{ $results{$key} }, $value;
有关此类概念的更多信息,请查看Perl Data Structures Cookbook。
答案 1 :(得分:1)
您只需要在尝试从哈希表中获取数据时检查是否存在。在向表中添加数据时,您不需要这样做。 此外,您不需要在数组上放置临时名称。您可以通过在数字列表周围放置[]来创建匿名数组。您也可以使用{}进行匿名哈希,但这并不直接与此问题相关。
my %results; #will store data like $results{$frequency} = [list of values]
# storing data:
my $key = int( ( $frequency * 100 ) / 20 );
push @{$results{$frequency}}, $value; #the @{ } means interpret $results{$frequency} as an array
# fetching data, here is where you check if things exist, sometimes
foreach (keys %results) {
print "For $_ frequency...\n";
print "The values are: @{$results{$_}}\n\n"; #if you don't include @{ }, it will say ARRAYREF(0xsdfasdf)
}