Perl 排序多个键散列
Perl Sorting Multiple Keys Hash
我有一个散列
%grades{$subject}{$student}=$score
我正在尝试从需要排序的散列中提取学生每个科目的前 30 名分数,但我不确定如何对多键散列进行排序。
到目前为止我已经有了这个,但这给了我每一个分数,而不是每个科目我需要的前 30 名。另外,有没有更快的方法来执行查询,因为我有将近 20 万学生。
foreach my $subject(sort keys %grades) {
foreach my $student(keys %{ $grades{$subject} }) {
print "$subject, $student: $grades{$subject}{$student}\n";
}
}
数一数。
$count++;
last if $count > 30;
这对每个科目的前 2 名分数进行排序(仅用于说明目的)。您应该将前 30 名的 0 .. 1
更改为 0 .. 29
:
use warnings;
use strict;
my %grades = (
math => {bill=>55, joe=>66, mike=>77},
hist => {bill=>72, joe=>33, mike=>99},
read => {bill=>95, joe=>24, mike=>22},
);
for my $subject (sort keys %grades) {
my %gr = %{ $grades{$subject} };
for my $student ((reverse sort { $gr{$a} <=> $gr{$b} } keys %gr)[0 .. 1]) {
print "$subject $student $gr{$student}\n";
}
}
__END__
hist mike 99
hist bill 72
math mike 77
math joe 66
read bill 95
read joe 24
参考perldoc perldsc and How do I sort a hash (optionally by value instead of key)?
我有一个散列
%grades{$subject}{$student}=$score
我正在尝试从需要排序的散列中提取学生每个科目的前 30 名分数,但我不确定如何对多键散列进行排序。
到目前为止我已经有了这个,但这给了我每一个分数,而不是每个科目我需要的前 30 名。另外,有没有更快的方法来执行查询,因为我有将近 20 万学生。
foreach my $subject(sort keys %grades) {
foreach my $student(keys %{ $grades{$subject} }) {
print "$subject, $student: $grades{$subject}{$student}\n";
}
}
数一数。
$count++;
last if $count > 30;
这对每个科目的前 2 名分数进行排序(仅用于说明目的)。您应该将前 30 名的 0 .. 1
更改为 0 .. 29
:
use warnings;
use strict;
my %grades = (
math => {bill=>55, joe=>66, mike=>77},
hist => {bill=>72, joe=>33, mike=>99},
read => {bill=>95, joe=>24, mike=>22},
);
for my $subject (sort keys %grades) {
my %gr = %{ $grades{$subject} };
for my $student ((reverse sort { $gr{$a} <=> $gr{$b} } keys %gr)[0 .. 1]) {
print "$subject $student $gr{$student}\n";
}
}
__END__
hist mike 99
hist bill 72
math mike 77
math joe 66
read bill 95
read joe 24
参考perldoc perldsc and How do I sort a hash (optionally by value instead of key)?