gpt4 book ai didi

sorting - Perl 按值对哈希进行排序

转载 作者:行者123 更新时间:2023-12-05 08:45:55 24 4
gpt4 key购买 nike

我有一个看起来像的散列


'Jarrod' => {
'Age' => '25 ',
'Occupation' => Student
},
'Elizabeth' => {
'Age' => '18',
'Occupation' => Student
},
'Nick' => {
'Age' => '32 ',
'Occupation' => Lawyer
},

我正在尝试按年龄对它们进行排序,这样看起来会像

'Nick' => {
'Age' => '32 ',
'Occupation' => Lawyer
},
'Jarrod' => {
'Age' => '25 ',
'Occupation' => Student
},
'Elizabeth' => {
'Age' => '18',
'Occupation' => Student
},

但我似乎无法弄清楚如何访问超过 Age 的任何内容。订购哈希键时如何访问值的值?

最佳答案

具有显示数据的散列变量%h可以按照所需的顺序处理

use Data::Dump qw(pp);  # to print out a complex data structure

say "$_->[0] => ", pp($_) for
map { [ $_, $h{$_} ] }
sort { $h{$b}->{Age} <=> $h{$a}->{Age} }
keys %h;

打印什么(来自下面的完整程序)

Nick => { Age => "32 ", Occupation => "Lawyer" }
Jarrod => { Age => "25 ", Occupation => "Student" }
Elizabeth => { Age => 18, Occupation => "Student" }

请注意,虽然我们不能对哈希进行“排序”,然后再以这种方式进行排序,因为哈希本质上是随机排列的。 但是我们当然可以遍历并处理一个元素特定顺序,如上例。

解释:sort依次获取提交列表的成对元素,在变量 $a$b 中可用,然后运行我们提供的代码块,因此到 compare他们按照规定。在这里,我们让它根据键 Age 处的值比较并排序元素。

不过,输出只是这样排序的那些键!因此,我们然后通过一个 map 传递它,它将每个键与其 hashref 值组合起来并返回这些对,每个都在一个 arrayref 中。用于打印它们,作为实际处理的占位符。

一个完整的程序

use warnings;
use strict;
use feature 'say';
use Data::Dump qw(dd pp);

my %h = (
'Jarrod' => {
'Age' => '25 ',
'Occupation' => 'Student'
},
'Elizabeth' => {
'Age' => '18',
'Occupation' => 'Student'
},
'Nick' => {
'Age' => '32 ',
'Occupation' => 'Lawyer'
},
);

say "$_->[0] => ", pp($_->[1]) for
map { [ $_, $h{$_} ] } sort { $h{$b}->{Age} <=> $h{$a}->{Age} } keys %h;

或者,对于一个可行的模板,更改为类似

my @sorted_pairs = 
map { [ $_, $h{$_} ] } sort { $h{$b}->{Age} <=> $h{$a}->{Age} } keys %h;

for my $key_data (@sorted_pairs) {
say $key_data->[0], ' => ', pp $key_data->[1]; # or just: dd $key_data;

# my ($name, $data) = @$key_data;
# Process $data (a hashref) for each $name
}

一旦我们开始为有序数据构建更合适的数据结构,就会有多种选择,包括每个名称的单人哈希引用,以正确的顺序存储在数组中。最终,所有这些都可以很好地组织在一个类中。


注意如何 Sort::Key使排序部分变得不那么麻烦

use Sort::Key qw(rnkeysort);  # rn... -> Reverse Numerical

my @pairs = map { [ $_, $h{$_} ] } rnkeysort { $h{$_}->{Age} } keys %h;

排序越复杂——或具体——从这个模块中受益越多,它有许多针对通用标准的特定函数。

如果这些年龄以整数形式给出,则有 ikeysort(和 rikeysort),然后这些是无符号整数,有 ukeysort(和 rukeysort)。


参见 keysperlsec ,例如。

关于sorting - Perl 按值对哈希进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70945672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com