根据perl中哈希值的值排序键(也是值)

时间:2017-11-27 13:16:44

标签: perl sorting hash

例如,这是我的哈希

     'Level1_A' => {
                                  'Level2_A' => 1071,
                                  'Level2_B' => 3429,
                                  'Level2_C' => 3297
                    },
      'Level1_B' => {
                                  'Level2_A' => 702,
                                  'Level2_B' => 726
                    },

我想要一个看起来像

的输出
  'Level1_A' => {
                              'Level2_B' => 3429,
                              'Level2_C' => 3297,
                              'Level2_A' => 1071

                },
  'Level1_B' => {
                              'Level2_B' => 726,
                              'Level2_A' => 702
                },

最终,我想要对应于最高值的键。

Level1_A ___ Level2_B ___ 3429

Level1_B ___ Level2_A ____ 726

1 个答案:

答案 0 :(得分:3)

哈希本质上是无序的,没有办法对它们进行排序。但是,您可以找到哈希值的最大,最好使用模块来帮助

List::UtilsBy提供max_by并允许您找到与最大数值对应的哈希键

喜欢这个

use strict;
use warnings 'all';

use List::UtilsBy 'max_by';

my $data = {
    'Level1_A' => {
        'Level2_A' => 1071,
        'Level2_B' => 3429,
        'Level2_C' => 3297,
    },
    'Level1_B' => {
        'Level2_A' => 702,
        'Level2_B' => 726
    },
};

for my $k1 ( sort keys %$data ) {

    my $v1 = $data->{$k1};

    my $k2 = max_by { $v1->{$_} } keys %$v1;

    printf "%s %s %s\n", $k1, $k2, $v1->{$k2};
}

输出

Level1_A Level2_B 3429
Level1_B Level2_B 726