Perl - 如何根据列的值对数组进行排序,同时保持散列中指定的顺序? [已关闭]

问题描述 投票:0回答:2

%probes - 是任意顺序的探针名称列表(按其位置组织,不是按字母顺序或数字排列)。

我需要根据每个数组中第一列/单元格的值(探针名称)对数组数组(@data_a)进行排序,但根据我在有序散列%probes中指定的顺序对它们进行排序。

@data_a 看起来像:

(
 (D88 5833.4 82544.0),
 (D92 3431.1 3432.1),
 ....
)


@data_asort=sort {$a->[0] cmp $b->[0]} @data_a;

将按特定列排序,这可行,但按字母数字顺序排序:

(
 (100X 45454.1 48482.2),
 (105Y 49911.1 81819.2),
...
)

我看到了:

@data_bsort=sort {$probes{$b} <=> $probes{$a}} keys %probes; 

将根据 %probes 中的顺序对名称列表进行排序。

我需要以某种方式将这两者结合起来,按第一列(探针名称)对大数组进行排序,维护所有关联的数值,并按 %probes 的顺序排序。

我想在 %probes 哈希中指定的顺序:

my %probes = ("KCNT2 E3"=>1,"KCNT2 E1"=>2,"CFH E1"=>3,...);

建议的组合方法如下:

@data_bsort= sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a;

不影响数组的顺序,但这可能是因为它是为了对数组而不是数组的数组进行排序。

perl sorting
2个回答
1
投票

您的问题中没有足够的信息,除了显而易见的信息之外无法为您提供建议:

my @data_sort = sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a;

但是,我有两个建议可能会对您自己解决问题大有帮助。

  1. 始终在 every

     Perl 脚本中包含 
    use strict;
    use warnings;

    这是成为一名更好的程序员可以做的第一件事,也是人们每次在 Stack Overflow 上提问时都应该模仿的事情。

    最初的进入障碍是必须在每个变量之前使用

    my
    声明来重新编写脚本,但这是一个值得的情况。 另外,不要偷懒,只需在脚本顶部声明所有变量即可。 尝试为每个变量提供尽可能小的范围。 这不仅使代码更具可读性,而且还可以帮助这两个编译指示向您指出明显的错误。

    在这种情况下,您很可能使用的是实际上未定义的键或值,如果

    warnings
    能够帮助您了解以下消息,那将会非常有帮助:

     Use of uninitialized value in sort
    
  2. 按复杂结构排序时,考虑使用

    map
    for
    先打印出变换。

     # my @data_sort = sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a;
    
     print "'$probes{$_->[0]}'\n" for @data_a;
    

    您在修改后的问题中指出上述

    sort
    不起作用? 好吧,为了调试,查看实际排序依据会很有用。

无论如何,您是在正确的地方获得有关问题的帮助,但您只需要提供更多信息即可获得详细的帮助。

看看您是否可以将问题缩小为包含 5 个元素的简短示例数据结构。 对于您的

%probes
结构也是如此,并分享这些内容以及您预期的排序顺序的详细信息。


0
投票

我相信根据你写的内容,这就是你想要的:

@data_sort = sort {$probes{$a->[0]} <=> $probes{$b->[0]} } @data_a

根据每个数组引用的第一个值用作 %probes 哈希中的键,对 @data_a 中的数组引用进行排序。

© www.soinside.com 2019 - 2024. All rights reserved.