如何在Perl中按值(内部)数组对数组数组的哈希值进行排序

时间:2015-03-14 18:55:05

标签: perl sorting multidimensional-array data-structures 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'
        ]
    ]
}

我想根据' 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'
        ]
    ]
}

如何执行此任务,因为我想选择具有更大值的键,所以我想转移其他键。

有什么建议吗?提前谢谢。

3 个答案:

答案 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' ] ]
    ]