【问题标题】:Perl sorting minimal values with filtering zerosPerl 使用过滤零对最小值进行排序
【发布时间】:2016-07-25 08:26:07
【问题描述】:

我有 perl 代码,其中排序选择最小值,但如果一个值为 0,则应忽略它。 这是没有过滤的排序功能:

sub desc_Emin
{
 my($emin)=(sort{$b<=>$a} @_)[-1];
 return $emin;
}

这个函数被调用并取值:

$desc_mv[$n]=desc_Emin($descs_a[$n],$descs_b[$n],$descs_c[$n]);

比如有一个列表:

descs_a  descs_b  descs_c
1        4        5
0        1        3
0        0        0
2        2        0

排序后 [$desc_mv] 应该是:

1
1
0
2

如何在不添加大量“if”语句的情况下进行过滤?最好在 "$desc_mv[$n]=desc_Emin(..." 部分过滤零?

我的快速时间解决方案如下所示:

            if($descs_a[$n] == $descs_b[$n] and $descs_b[$n] == $descs_c[$n] ){
            $desc_mv[$n]=$descs_a[$n];                  
            }
            else{

            use Switch;
            switch($descs_a[$n]){
                case 0 {$descs_a[$n] = 99999999999999};                     
            }
            use Switch;
            switch($descs_b[$n]){
                case 0 {$descs_b[$n] = 99999999999999};
            }
            use Switch;
            switch($descs_c[$n]){
                case 0 {$descs_c[$n] = 99999999999999};
            }

            $desc_mv[$n]=desc_Emin($descs_a[$n],$descs_b[$n],$descs_c[$n]);
            }

【问题讨论】:

  • 当你需要找东西时,你应该使用grep/map/for,而不是sort
  • @OlegV.Volkov 但是我有数值,为什么要使用 grep 和 map? $descs_a[1] 已经是 1 并且 $descs_c[1]0。代码不是我写的——我正在使用它并试图修复这个错误。
  • 我不明白你的问题。您是否以某种方式认为grep 用于字符串?不,不是。
  • @OlegV.Volkov 是的,这是我第一次真正编辑 perl 脚本。

标签: arrays perl sorting filtering


【解决方案1】:

你把事情复杂化了。您需要扫描所有值,跳过 0 并记住每个新值,如果它小于以前记住的值。只需在 Perl 中准确地写出来:

sub desc_Emin {
    my $min = 0;
    for my $val (@_) {
        # if we're remembering 0, replace it with anything OR (if new value is not 0 and smaller than what we remember, remember that)
        if ($min == 0 || ($val != 0 && $min > $val)) { $min = $val }
    }
    return $min;
}

【讨论】:

  • 这正是我要找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 2011-03-17
相关资源
最近更新 更多