我很难解决这个问题,我敢肯定,今天只是一个例子。我有一个与此类似的数据结构:
{
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}};
}
有人介意将我指向正确的方向,以便按内部哈希值对哈希或哈希数组进行排序吗?
最佳答案
假设上面的$VAR
是Data::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/