perl中哈希值的排序

perl中哈希值的排序,perl,sorting,hash,Perl,Sorting,Hash,可能重复: 我在网上浏览了很多次,想找到一个解决方案,但是我找不到任何满足我需要的东西 我有一个很大的单词列表,每个单词都附有值 例如: my %list = ( word => 10, xword => 15, yword => 1 ) 这个列表还在继续,但我希望能够返回具有最高对应值的前5个哈希元素这就是您需要的。请注意,如果您的哈希值少于五个元素,它将抛出使用未初始化值警告,您可能需要添加代码来满足这一要求。它的效率也很低,因为它对整个哈希进行排序,而不是

可能重复:

我在网上浏览了很多次,想找到一个解决方案,但是我找不到任何满足我需要的东西

我有一个很大的单词列表,每个单词都附有值

例如:

my %list = (
  word => 10,
  xword => 15,
  yword => 1
)

这个列表还在继续,但我希望能够返回具有最高对应值的前5个哈希元素

这就是您需要的。请注意,如果您的哈希值少于五个元素,它将抛出
使用未初始化值
警告,您可能需要添加代码来满足这一要求。它的效率也很低,因为它对整个哈希进行排序,而不是只查找前五个值。这是否是一个问题取决于你的情况

use strict;
use warnings;

sub topN {
  my ($N, %list) = (shift, @_);
  $N = keys %list if $N > keys %list;
  return (sort { $list{$b} <=> $list{$a} } keys %list)[0..$N-1];
}

my %list = ( word => 10, xword => 15, yword => 1, zword => 4);     
print join (",", topN(5, %list)), "\n";
use strict;
use warnings;

my %list = (
  word => 10,
  xword => 15,
  yword => 1,
);

my @top5 = (sort { $list{$b} <=> $list{$a} } keys %list)[0..4];

print "$_\n" for @top5;
使用严格;
使用警告;
我的%list=(
word=>10,
xword=>15,
yword=>1,
);
my@top5=排序{$list{$b}$list{$a}}键%list;
如果@top5>5,则拼接(@top5,5);
为@top5打印“$\un”;

在什么意义上?您的是相同的:)因此splice复制了列表,但
[0..4]
没有复制?您的子例程在没有请求时会将问题概括化,而且它太长,以至于Perl的内联优化不会生效<代码>拼接
在丢弃前不必要地修改
@list
。您还不必要地修改了
@
。您的速度快了600毫秒,在我的系统上有100万个元素,完成时间约为9秒。这不是+1提出的竞争,而是担心
[0..4]
片内存不足。在这种情况下,这是错误的还是重要的?@Kenosis:这取决于
%list
的大小。如果数据量很大,那么内存可能是一个问题,但您也希望对前N个项目进行选择排序,而不是对整个项目进行排序。请注意,
If@top5>5
可以删除,而无需在5.16+中添加警告。
use strict;
use warnings;

my %list = (
  word => 10,
  xword => 15,
  yword => 1,
);

my @top5 = (sort { $list{$b} <=> $list{$a} } keys %list)[0..4];

print "$_\n" for @top5;
xword
word
yword
use strict;
use warnings;

my %list = (
   word => 10,
   xword => 15,
   yword => 1,
);

my @top5 = sort { $list{$b} <=> $list{$a} } keys %list;
splice(@top5, 5) if @top5 > 5;

print "$_\n" for @top5;