如何对 perl 哈希进行排序?
How to sort perl hash?
我有下面的哈希结构,哈希的哈希。
$VAR1 = { '191' => { 'test1' => { 'score' => '9.18' }, 'test2' => { 'score' => '2.84' },
'test3' => { 'score' => '15.62' }, 'test4' => { 'score' => '11.84' },
'190' => { 'test1'=> { 'score' => '13.28' }, 'test2' => { 'score' => '-47.56' },
'test3' => { 'score' => '18.50' }, 'test4' => { 'score' => '14.88' } } }
我正在尝试根据 'score' 值对哈希进行排序。排序应该只发生在主键 '191' 和 '190' 的内部。请参阅下面的哈希结构以获得预期结果。
$VAR1 = { '191' => {'test3' => { 'score' => '15.62' }, 'test4' => { 'score' => '11.84' }
'test1' => { 'score' => '9.18' }, 'test2' => { 'score' => '2.84' },
'190' => { 'test3' => { 'score' => '18.50' }, 'test4' => { 'score' => '14.88' }
'test1'=> {'score' => '13.28' }, 'test2' => { 'score' => '-47.56' } } }
将根据分数值降序进行排序。
我已经尝试了下面的代码,但它有点基于主键进行排序。
我需要如预期哈希结构所示的输出。
my @sort_by_rank;
for my $key1 (keys %rankBased) {
for my $key2 (keys %{$rankBased{$key1}}) {
@sort_by_rank = sort{ $rankBased{$b}{$key2}{score} <=> $rankBased{$a}{$key2}{score}
} keys %rankBased;
}
}
这里的 %rankBased 是哈希值。
请帮忙。
您无法对散列进行排序,但可以对散列的键列表进行排序。
for my $student_id (keys %tests_by_student_id) {
my $tests = $tests_by_student_id{$student_id};
my @sorted_test_ids =
sort { $tests->{$b}{score} <=> $tests->{$a}{score} }
keys(%$tests);
# Do something with the student's sorted tests here.
}
(无意义 %rankBased
重命名为 %tests_by_student_id
。)
以上是很棒的是你想对每个学生做点什么。但是如果你真的想“排序散列”,你需要切换到不同的结构。
for my $student_id (keys %tests_by_student_id) {
# This next line is the same as
# my $tests = $tests_by_student_id{$student_id};
# except changing $tests also changes
# $tests_by_student_id{$student_id}.
for my $tests ($tests_by_student_id{$student_id}) {
$tests = [
sort { $b->{score} <=> $a->{score} }
map { { id => $_, %{ $tests->{$_} } } }
keys(%$tests)
];
}
}
这会产生
$VAR1 = {
'191' => [ { id => 'test3', score => 15.62 },
{ id => 'test4', score => 11.84 },
{ id => 'test1', score => 9.18 },
{ id => 'test2', score => 2.84 } ],
'190' => [ { id => 'test3', score => 18.50 },
{ id => 'test4', score => 14.88 },
{ id => 'test1', score => 13.28 },
{ id => 'test2', score => -47.56 } ],
};
我有下面的哈希结构,哈希的哈希。
$VAR1 = { '191' => { 'test1' => { 'score' => '9.18' }, 'test2' => { 'score' => '2.84' },
'test3' => { 'score' => '15.62' }, 'test4' => { 'score' => '11.84' },
'190' => { 'test1'=> { 'score' => '13.28' }, 'test2' => { 'score' => '-47.56' },
'test3' => { 'score' => '18.50' }, 'test4' => { 'score' => '14.88' } } }
我正在尝试根据 'score' 值对哈希进行排序。排序应该只发生在主键 '191' 和 '190' 的内部。请参阅下面的哈希结构以获得预期结果。
$VAR1 = { '191' => {'test3' => { 'score' => '15.62' }, 'test4' => { 'score' => '11.84' }
'test1' => { 'score' => '9.18' }, 'test2' => { 'score' => '2.84' },
'190' => { 'test3' => { 'score' => '18.50' }, 'test4' => { 'score' => '14.88' }
'test1'=> {'score' => '13.28' }, 'test2' => { 'score' => '-47.56' } } }
将根据分数值降序进行排序。
我已经尝试了下面的代码,但它有点基于主键进行排序。 我需要如预期哈希结构所示的输出。
my @sort_by_rank;
for my $key1 (keys %rankBased) {
for my $key2 (keys %{$rankBased{$key1}}) {
@sort_by_rank = sort{ $rankBased{$b}{$key2}{score} <=> $rankBased{$a}{$key2}{score}
} keys %rankBased;
}
}
这里的 %rankBased 是哈希值。
请帮忙。
您无法对散列进行排序,但可以对散列的键列表进行排序。
for my $student_id (keys %tests_by_student_id) {
my $tests = $tests_by_student_id{$student_id};
my @sorted_test_ids =
sort { $tests->{$b}{score} <=> $tests->{$a}{score} }
keys(%$tests);
# Do something with the student's sorted tests here.
}
(无意义 %rankBased
重命名为 %tests_by_student_id
。)
以上是很棒的是你想对每个学生做点什么。但是如果你真的想“排序散列”,你需要切换到不同的结构。
for my $student_id (keys %tests_by_student_id) {
# This next line is the same as
# my $tests = $tests_by_student_id{$student_id};
# except changing $tests also changes
# $tests_by_student_id{$student_id}.
for my $tests ($tests_by_student_id{$student_id}) {
$tests = [
sort { $b->{score} <=> $a->{score} }
map { { id => $_, %{ $tests->{$_} } } }
keys(%$tests)
];
}
}
这会产生
$VAR1 = {
'191' => [ { id => 'test3', score => 15.62 },
{ id => 'test4', score => 11.84 },
{ id => 'test1', score => 9.18 },
{ id => 'test2', score => 2.84 } ],
'190' => [ { id => 'test3', score => 18.50 },
{ id => 'test4', score => 14.88 },
{ id => 'test1', score => 13.28 },
{ id => 'test2', score => -47.56 } ],
};