perl - 使用多个条件对嵌套哈希进行排序
问题描述
我对 perl 编程有点陌生,我有一个可以这样表述的哈希:
$hash{"snake"}{ACB2} = [70, 120];
$hash{"snake"}{SGJK} = [183, 120];
$hash{"snake"}{KDMFS} = [1213, 120];
$hash{"snake"}{VCS2} = [21, 120];
...
$hash{"bear"}{ACB2} = [12, 87];
$hash{"bear"}{GASF} = [131, 87];
$hash{"bear"}{SDVS} = [53, 87];
...
$hash{"monkey"}{ACB2} = [70, 230];
$hash{"monkey"}{GMSD} = [234, 230];
$hash{"monkey"}{GJAS} = [521, 230];
$hash{"monkey"}{ASDA} = [134, 230];
$hash{"monkey"}{ASMD} = [700, 230];
哈希的结构总结如下:
%hash{Organism}{ProteinID}=(protein_length, total_of_proteins_in_that_organism)
我想根据某些条件对这个哈希进行排序。首先,我只想考虑那些蛋白质总数高于 100 的生物体,然后我想显示生物体的名称以及最大的蛋白质及其长度。
为此,我将采用以下方法:
foreach my $org (sort keys %hash) {
foreach my $prot (keys %{ $hash{$org} }) {
if ($hash{$org}{$prot}[1] > 100) {
@sortedarray = sort {$hash{$b}[0]<=>$hash{$a}[0]} keys %hash;
print $org."\n";
print @sortedarray[-1]."\n";
print $hash{$org}{$sortedarray[-1]}[0]."\n";
}
}
}
但是,这会打印出生物体名称的次数与蛋白质总数一样多,例如,它打印“蛇”120 次。此外,这不是正确排序,因为我想我应该在排序行中使用变量 $org 和 $prot。
最后,输出应如下所示:
snake
"Largest protein": KDMFS [1213]
monkey
"Largest protein": ASMD [700]
解决方案
所有数据在打印中排序
use warnings;
use strict;
use feature 'say';
use List::Util qw(max);
my %hash;
$hash{"snake"}{ACB2} = [70, 120];
$hash{"snake"}{SGJK} = [183, 120];
$hash{"snake"}{KDMFS} = [1213, 120];
$hash{"snake"}{VCS2} = [21, 120];
$hash{"bear"}{ACB2} = [12, 87];
$hash{"bear"}{GASF} = [131, 87];
$hash{"bear"}{SDVS} = [53, 87];
$hash{"monkey"}{ACB2} = [70, 230];
$hash{"monkey"}{GMSD} = [234, 230];
$hash{"monkey"}{GJAS} = [521, 230];
$hash{"monkey"}{ASDA} = [134, 230];
$hash{"monkey"}{ASMD} = [700, 230];
my @top_level_keys_sorted =
sort {
( max map { $hash{$b}{$_}->[0] } keys %{$hash{$b}} ) <=>
( max map { $hash{$a}{$_}->[0] } keys %{$hash{$a}} )
}
keys %hash;
for my $k (@top_level_keys_sorted) {
say $k;
say "\t$_ --> @{$hash{$k}{$_}}" for
sort { $hash{$k}{$b}->[0] <=> $hash{$k}{$a}->[0] }
keys %{$hash{$k}};
}
这首先根据要求按 arrayref 值中的第一个数字对顶级键进行排序。有了这个排序的键列表,我们然后进入每个键的 hashref 并进一步排序。该循环是我们将调整以根据需要限制输出(按总数计算前 100 个,仅按长度计算最大,等等)。
它打印
蛇 KDMFS --> 1213 120 新加坡--> 183 120 ACB2 --> 70 120 VCS2 --> 21 120 猴 ASMD --> 700 230 GJAS --> 521 230 GMSD --> 234 230 阿斯达 --> 134 230 ACB2 --> 70 230 熊 天然气-> 131 87 SDVS --> 53 87 ACB2 --> 12 87
我不知道输出是应该显示所有“蛋白质总数高于 100 的生物体”(文本)还是只显示最大的一个(所需的输出),所以我将全部保留。根据需要切断。要仅获得最大的,要么比较循环中每个键的最大值,要么查看这篇文章(同样的问题)。
请注意,哈希本身不能“排序”,因为它本质上是无序的。但是我们可以像上面那样打印出排序的东西,或者在需要时生成可以排序的辅助数据结构。
推荐阅读
- postgresql - 在 Postgres 中没有主键的表中更新或删除时锁定了什么?
- jquery - 当onclick-button send() 不显示已发送电子邮件中的输入时,jQuery 中的复选框
- arrays - TypeScript:将类型推断为数组方括号的优雅方法 []
- android - Android TLS Socket 连接无法以编程方式添加热点
- python - 如何更改我的熊猫数据框的 dtype?
- python - 如何将变量值从一个文件中的一个类传递给另一个文件中的另一个类python tkinter
- bash - zshrc 无法识别自定义 bash 函数
- geometry - 根据点云的圆将区域划分为子区域
- sql - 如何旋转一个值的总和
- r - 在R中向后生成四分之一序列