根据值对深度嵌套散列的键进行排序?

克罗

尝试根据其值对嵌套哈希进行排序,长话短说,我稍后解析%senseHash某些值并将其存储在%rankedTest哈希中,我想循环排序%rankedTest和输出以归档我的代码:

foreach my $str (keys %senseHash)
{
    my $selectedSense;
    if (exists $senseHash{$str}{'phone'} && exists $senseHash{$str}{'product'})
     {
        if ($senseHash{$str}{'phone'} > $senseHash{$str}{'product'})
        {
            $selectedSense='phone';
        }else
        {
            $selectedSense='product';
        }
         my $pPhone = $senseHash{$str}{'phone'} / $senses{'phone'};
         my $pProduct = $senseHash{$str}{'product'} / $senses{'product'};
         my $rankScore = abs(log($pPhone/$pProduct));
         $rankedTest{$str}{$selectedSense}=$rankScore;
     }
}
open($f1, '>', $inputs[1]);
foreach my $e (keys  %rankedTest)
{
    foreach my $s (sort { $rankedTest{$e}{$b} <=> $rankedTest{$e}{$a} } keys %{$rankedTest{$e}})
    {
        print $f2 "feature:$e -> sense:$s -> score:$rankedTest{$e}{$s} \n";
    }
} 

但输出如下:

feature:operations -> sense:product -> score:0.0859904478555225 
feature:move -> sense:product -> score:0.309133999169732 
feature:dispute -> sense:phone -> score:0.0963311089384321 

而我真正想要的是:

feature:move -> sense:product -> score:0.309133999169732 
feature:dispute -> sense:phone -> score:0.0963311089384321 
feature:operations -> sense:product -> score:0.0859904478555225

任何线索我做错了什么或我如何能做到这一点。任何建议都会有所帮助。

编辑:内部散列有一个键,可以是电话或产品,我想根据此键值进行排序,而不管键是否phoneproduct

要按底层的值对多级散列进行排序,我们必须比较所有条目。

此代码使用 (double) map构建要为所有级别打印的字符串,然后对其进行排序

use warnings;
use strict;
use feature 'say';

# Example hash     
my %h = ( 
    oper => { prod => 0.8, phone => 0.03 },  
    disp => { prod => 0.2, phone => 0.05 },  
    move => { prod => 0.6, phone => 0.01 } 
); 

my @res = 
    sort { (split ":", $b)[-1] <=> (split ":", $a)[-1] }
    map { 
        my $k = $_; 
        map { "feature:$k -> sense:$_ -> score:$h{$k}{$_}" }
        keys %{$h{$k}} 
    }   
    keys %h; 

say for @res;

输出

feature:oper -> sense:prod -> score:0.8 
feature:move -> sense:prod -> score:0.6 
feature:disp -> sense:prod -> score:0.2 
feature:disp -> sense:phone -> score :0.05 
feature:oper -> sense:phone -> score:0.03 
feature:move -> sense:phone -> score:0.01

我将phone值设置为小于prod' 以模拟发布的数据(与处理无关)。

示例哈希在问题中%h代表%rankedTest它可能有一个或两个(或没有)prodphone在子哈希中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章