在Perl中,我想按值对散列的键进行排序:
{ five => 5 ten => 10 one => 1 four => 4 }
产生两个阵列:
(1,4,5,10) and (one, four, five, ten)
然后,我想规范化值数组,使数字是连续的:
(1,2,3,4)
我该怎么做?
eh57zj3b1#
首先按照相关的值对键进行排序。然后获取值(例如,通过使用哈希片)。
my @keys = sort { $h{$a} <=> $h{$b} } keys(%h); my @vals = @h{@keys};
或者如果您有哈希引用。
my @keys = sort { $h->{$a} <=> $h->{$b} } keys(%$h); my @vals = @{$h}{@keys};
insrf1ej2#
如何对哈希进行排序(可以选择按值而不是键)?
要对散列进行排序,首先从键开始。在本例中,我们将键列表提供给排序函数,然后排序函数按ASCII字母顺序对它们进行比较(这可能会受到您的区域设置的影响)。输出列表中的键按ASCII字母顺序排列。一旦我们得到键,我们就可以通过它们创建一个按ASCII字母顺序列出键的报告。
my @keys = sort { $a cmp $b } keys %hash; foreach my $key ( @keys ) { printf "%-20s %6d\n", $key, $hash{$key}; }
我们可以在sort()代码块中做得更好一些,我们可以用它们计算一个值,然后用这个值作为比较,而不是比较键。例如,为了使我们的报表顺序不区分大小写,我们在比较键之前使用lc将它们小写:
my @keys = sort { lc $a cmp lc $b } keys %hash;
注意:如果计算开销很大或者哈希包含很多元素,您可能需要查看Schwartzian变换来缓存计算结果。如果我们想按哈希值排序,我们可以使用哈希键来查找它,我们仍然得到一个键列表,但这次是按值排序的。
my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;
如果哈希值相同,我们可以对哈希键进行二次排序。
my @keys = sort { $hash{$a} <=> $hash{$b} or "\L$a" cmp "\L$b" } keys %hash;
fae0ux8s3#
请参见Perl常见问题解答条目“如何对散列进行排序(可选地按值而非键)"。您还可以使用perldoc -q在您的机器上本地搜索FAQ,就像在perldoc -q sort中一样,我就是这样找到您的答案的。
perldoc -q
perldoc -q sort
jmo0nnb34#
my ( @nums, @words ); do { push @nums, shift @$_; push @words, shift @$_; } foreach sort { $a->[0] <=> $b->[0] } map { [ $h->{ $_ }, $_ ] } keys %$h ;
zy1mlcev5#
有时候最好是表现出来而不是说出来......
%results = (Paul=>87, Ringo=>93, John=>91, George=>97); #display the results in ascending key (alphabetical) order print "key ascending...\n"; foreach $key ( sort { $a cmp $b } keys %results ){ print "$key=>$results{$key}\n"; } print "\n"; # display the results in descending key (alphabetical) order print "key descending...\n"; foreach $key ( sort { $b cmp $a } keys %results ){ print "$key=>$results{$key}\n"; } print "\n"; # display the results in descending value (numerical) order print "value ascending...\n"; foreach $key ( sort { $results{$a} <=> $results{$b} } keys %results ){ print "$key=>$results{$key}\n"; } print "\n"; # display the results in ascending value (numerical) order print "value descending...\n"; foreach $key ( sort { $results{$b} <=> $results{$a} } keys %results ){ print "$key=>$results{$key}\n"; }
5条答案
按热度按时间eh57zj3b1#
首先按照相关的值对键进行排序。然后获取值(例如,通过使用哈希片)。
或者如果您有哈希引用。
insrf1ej2#
如何对哈希进行排序(可以选择按值而不是键)?
要对散列进行排序,首先从键开始。在本例中,我们将键列表提供给排序函数,然后排序函数按ASCII字母顺序对它们进行比较(这可能会受到您的区域设置的影响)。输出列表中的键按ASCII字母顺序排列。一旦我们得到键,我们就可以通过它们创建一个按ASCII字母顺序列出键的报告。
我们可以在sort()代码块中做得更好一些,我们可以用它们计算一个值,然后用这个值作为比较,而不是比较键。
例如,为了使我们的报表顺序不区分大小写,我们在比较键之前使用lc将它们小写:
注意:如果计算开销很大或者哈希包含很多元素,您可能需要查看Schwartzian变换来缓存计算结果。
如果我们想按哈希值排序,我们可以使用哈希键来查找它,我们仍然得到一个键列表,但这次是按值排序的。
如果哈希值相同,我们可以对哈希键进行二次排序。
fae0ux8s3#
请参见Perl常见问题解答条目“如何对散列进行排序(可选地按值而非键)"。
您还可以使用
perldoc -q
在您的机器上本地搜索FAQ,就像在perldoc -q sort
中一样,我就是这样找到您的答案的。jmo0nnb34#
zy1mlcev5#
有时候最好是表现出来而不是说出来......