【问题标题】:Splitting input into buckets - Perl将输入拆分为存储桶 - Perl
【发布时间】:2014-10-22 11:50:48
【问题描述】:

我知道如何以冗长的方式做到这一点,但我想知道是否有一种简单的方法可以将一系列数字分成桶。

我有一系列将两个数字关联在一起的数据:

频率值

我想将这些值分解为频率的子部分,然后得到频率结果的 0.05 的每个跨度的成员的平均值和标准差。

所以我想要的是一系列包含与频率相关的值的数组。

我的长篇大论是

%results = ();
$key = int( ( $frequency * 100 ) / 20 );
if ( !exists( $results{$key} ) ) {
    @temp = ($value);
    $results{$key} = @temp;
} else {
    $results{$key} = push( $results{$key}, $value );
}

有办法简化吗?

【问题讨论】:

  • 如果您编辑问题以包括您从哪里获得$frequency$value 可能会提供更多信息——例如它们在数组中吗?一些复杂的数据结构?

标签: perl


【解决方案1】:

看起来您实际上想要一个数组哈希。

因此你只需要push:

push @{ $results{$key} }, $value;

有关此类概念的更多信息,请查看Perl Data Structures Cookbook

【讨论】:

    【解决方案2】:

    您只需要在尝试从哈希表中获取数据时检查事物是否存在。向表中添加数据时不需要这样做。 此外,您不需要在数组上放置临时名称。您可以通过将 [ ] 放在数字列表周围来制作匿名数组。您也可以使用 { } 进行匿名哈希,但这与此问题没有直接关系。

    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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 2017-01-19
      • 1970-01-01
      • 2019-10-22
      相关资源
      最近更新 更多