我很难解决这个问题,我敢肯定,今天只是一个例子。我有一个与此类似的数据结构:

{
  PDGFRA => [
    { "p.N659K" => 22 },
    { "p.D842Y" => 11 },
    { "p.I843_S847>T" => 9 },
    { "p.D842_H845del" => 35 },
    { "p.I843_D846delIMHD" => 24 },
    { "p.I843_D846del" => 21 },
    { "p.D842V" => 457 },
    { "p.N659Y" => 5 },
    { "p.M844_S847del" => 7 },
    { "p.S566_E571>K" => 8 },
    { "p.S566_E571>R" => 50 },
    { "p.V561D" => 54 },
  ],
}

我想打印出结果,并按哈希值反向排序(从最大到最小),所以最终我得到这样的结果
PDGFRA    p.D842V    457
PDGFRA    p.V561D    54
PDGFRA    p.S566_E571>R    50
PDGFRA    p.D842_H845del    35
.
.
.
etc.

我可以按照自己的意愿打印数据结构,但是我似乎无法弄清楚如何在打印数据之前对数据进行排序。我试图这样排序:
for my $gene ( sort keys %matches ) {
    for my $var ( sort { $a->{$var} <=> $b->{$var} } @{$matches{$gene}} {
        print "$var\n";
    }
 }

但是,无论我使用$var还是$_,它似乎都不起作用,抱怨 undefined '$ var'和未初始化'$ _'。我也尝试过(真的很可悲!)使用Schwarzian转换,但我认为我什至不熟悉这一点:
for my $gene ( sort keys %matches ) {
    my @sorted =
        map { $_->[0] }
        sort { $a->[1] <=> $b->[1] }
        map { [ $_, $matches{$gene}->{$_} ] } @{$matches{$gene}};
}

有人介意将我指向正确的方向,以便按内部哈希值对哈希或哈希数组进行排序吗?

最佳答案

假设上面的$VARData::Dumper::Dumper(\%matches) ...

如果您不想使您的数据结构更好。

for my $gene ( sort keys %matches ) {
    for my $hash ( sort {
                      my ($akey) = keys %$a;
                      my ($bkey) = keys %$b;
                      $a->{$akey} <=> $b->{$bkey}
                   } @{$matches{$gene}} ) {
        my ($key) = keys %$hash;
        print "$key => $hash->{$key}\n";
    }
}

该值是按值(例如:12)而不是键(例如:“p.I843_D846del”)排序的。我想出了,因为您使用了要按数值排序的数字比较;-)

编辑:内循环的固定主体。

编辑2:

我看到您尝试了Schwartzian Transform ...如果您保持数据结构不变,那可能是一种更有效的解决方案...如下:
for my $gene ( sort keys %matches ) {
    print "$_->[0] => $_->[1]\n" for                     # print both key and value
        sort { $a->[1] <=> $b->[1] }                     # sort by value (e.g: 35)
        map { my ($key) = keys %$_; [$key, $_->{$key}] } # e.g:['p.D842_H845del' ,35]
        @{$matches{$gene}};
}

但是,相反,我只是修复数据结构。

可能只需将“键”(例如:“p.I843_D846del”)和“值”(例如:12)都设置为两个值,并为其指定一致的键名称即可。

关于perl - 按内部哈希值对哈希数组的哈希排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20683953/

10-16 04:06