【问题标题】:Hash of hashes: How to get the number of occurrences of a key?散列的散列:如何获取键的出现次数?
【发布时间】:2013-04-14 04:34:26
【问题描述】:

我有以下文本文件。

foo1    bam
foo1    bam
foo2    bam
foo1    zip
foo2    boo
foo1    zip
foo3    zip

我想制作一个哈希哈希,其中 KEY1 是 第一列,KEY2 是它发出的声音(第二列):bam, zip ,或boo,VALUE 是该声音的出现次数。这样数据结构是这样的:

$VAR1 = {
      'foo1' => {
                         'bam' => [
                                    2
                                  ],
                         'zip' => [
                                  2
                                ],
                       },
      'foo2' => {
                        'bam' => [
                                 1
                               ],
                        'boo' => [
                                 1
                               ],
                      },
        'foo3' => {
                        'zip' => [
                                  1
                                ],
                    }
         }

这是我目前所拥有的

use strict; use warnings;    
open(my $fh, '<', 'file.txt') or die $!;
my %HoH;
while(<$fh>){
    chomp;
    my @cols = split(/\t/, $_);
    my $KEY1 = $cols[0];
    my $KEY2 = $cols[1];
    push( @{$HoH{$KEY1}{$KEY2}}, 1); # This actually creates a hash of hash of arrays
}

my %HoH_final;
foreach my $KEY1 (%HoH) {
    foreach my $KEY2 (keys %HoH{$KEY1}){
    my $count = scalar @{$HoH{$KEY1}{$KEY2}}; # get the size of that array
        push( @{$HoH_final{$KEY1}{$KEY2}}, $count);
   }
}

你怎么看?

【问题讨论】:

    标签: arrays perl hash


    【解决方案1】:

    你真的不想要下面的数据结构吗?

    {
       'foo1' => {
          'bam' => 2,
          'zip' => 2,
       },
       ...
    }
    

    如果是这样,

    while (<$fh>) {
        chomp;
        my @cols = split /\t/;
        ++$HoH{ $cols[0] }{ $cols[1] };
    }
    

    如果你真的想要单元素数组,

    while (<$fh>) {
        chomp;
        my @cols = split /\t/;
        ++$HoH{ $cols[0] }{ $cols[1] }[0];
    }
    

    【讨论】:

    • 是的,我想这是你写的我想要的。
    • 注意:++ 在没有警告的情况下认为 undef 为零,所以这里很完美。
    【解决方案2】:

    每个二级键指向一个arrayref而不是数字是否有原因?我建议这样做:

    while(<$fh>){
        chomp;
        my @cols = split(/\t/, $_);
        $HoH{ $cols[0] }{ $cols[1] }++;
    }
    

    这将在遇到每个二级键时增加 (++) 的值。

    【讨论】:

    • 是的,我想这就是我想要的。我只是不知道如何表示它。
    【解决方案3】:

    其实这样就可以了

     perl -F'\t' -ane'$h{$F[0]}{$F[1]}++'
    

    如果你想查看结果

     perl -MData::Dumper -F'\t' -ane'$h{$F[0]}{$F[1]}++}{print Dumper(\%h)'
    

    【讨论】:

      猜你喜欢
      • 2013-07-08
      • 2021-11-03
      • 2013-05-23
      • 1970-01-01
      • 2018-12-07
      • 2013-07-13
      • 2011-07-26
      • 1970-01-01
      • 2015-06-12
      相关资源
      最近更新 更多