我有这个数据结构,我的数据的产物:
'locus4 >9.+.2668516.2768570.GABA3.1.54.6586237.2718516.2718570 45880 46000 locus4' => {
'-1.19 +' => [
[
'+', '2', '120', '0.76', '0.809799'
]
],
'-1.19 -' => [
[
'-', '2', '120', '0.19', '0.585090'
]
]
}
我想根据' inside'的最后一个值来整理它。对应于由'内部'分组的数据的数组。密钥,在这种情况下:' -1.19 +'和' -1.19 - '。因为我想把内部数组中具有最大值的键放在哈希的底部。
换句话说:
'locus4 >9.+.2668516.2768570.GABA3.1.54.6586237.2718516.2718570 45880 46000 locus4' => {
'-1.19 -' => [
[
'-', '2', '120', '0.19', '0.585090'
]
],
'-1.19 +' => [
[
'+', '2', '120', '0.76', '0.809799'
]
]
}
如何执行此任务,因为我想选择具有更大值的键,所以我想转移其他键。
有什么建议吗?提前谢谢。
答案 0 :(得分:0)
要获取最后一个元素,请使用-1的索引。
my $inner_hash = $hash{'locus4 >9.+.2668516.2768570.GABA3.1.54.6586237.2718516.2718570 45880 46000 locus4'};
my @sorted = sort { $inner_hash->{$a}[-1]
<=>
$inner_hash->{$b}[-1]
} keys %$inner_hash;
print "@sorted\n";
答案 1 :(得分:0)
要通过逐个比较每个元素的某个表达式对列表进行排序,您可能希望使用名为List::UtilsBy
的{{1}}中的函数集合。特别是在这种情况下,由于关键表达式返回一个数字进行数字比较,您将需要使用sort_by
:
nsort_by
答案 2 :(得分:0)
散列中的键没有任何顺序,因此如果您想要按键,则必须将内部散列更改为数组。
my %hash = (
'locus4 >9.+.2668516.2768570.GABA3.1.54.6586237.2718516.2718570 45880 46000 locus4'
=> {
'-1.19 +' => [ [ '+', '2', '120', '0.76', '0.809799' ] ],
'-1.19 -' => [ [ '-', '2', '120', '0.19', '0.585090' ] ]
}
);
for my $value ( values %hash ) {
$value = [
map +[ $_, $value->{$_} ],
sort { $value->{$a}[0][-1] <=> $value->{$b}[0][-1] } keys %$value
];
}
结果将是
'locus4 >9.+.2668516.2768570.GABA3.1.54.6586237.2718516.2718570 45880 46000 locus4'
=> [
[ '-1.19 -', [ [ '-', '2', '120', '0.19', '0.585090' ] ] ],
[ '-1.19 +', [ [ '+', '2', '120', '0.76', '0.809799' ] ] ]
]
我建议在内部删除双数组,所以代码看起来像:
for my $value ( values %hash ) {
$value = [
map +[ $_, $value->{$_}[0] ],
sort { $value->{$a}[0][-1] <=> $value->{$b}[0][-1] } keys %$value
];
}
结果:
'locus4 >9.+.2668516.2768570.GABA3.1.54.6586237.2718516.2718570 45880 46000 locus4'
=> [
[ '-1.19 -', [ '-', '2', '120', '0.19', '0.585090' ] ],
[ '-1.19 +', [ '+', '2', '120', '0.76', '0.809799' ] ]
]