【问题标题】:How to get first n key-value pairs from a hash table in Perl如何从 Perl 中的哈希表中获取前 n 个键值对
【发布时间】:2012-10-29 07:09:53
【问题描述】:

我对 perl 很陌生,所以我搜索了一段时间,但仍然得到了答案。我想从哈希表中获取前 100 对,但不知道该怎么做。要从哈希表中获取每一对,我们可以执行以下操作:

foreach my $term (keys %hashtable)
{
    do something regarding $hashtable{$term} here
}

但是如何从中取出前 100 双呢?非常感谢!

【问题讨论】:

  • 我建议从这个问题中删除“第一”这个词。哈希表没有排序,所以没有“第一”的概念。

标签: perl hash


【解决方案1】:

另一种方式:

my %hash100 = (%hashtable)[0..199];
while ( my ($key, $value) = each %hash100 ) {
    ...
}

或:

for my $key ( (keys %hashtable)[0..99] ) {
    my $value = $hashtable{$key};
    ...
}

【讨论】:

  • 拜托,您能解释一下为什么在您编写的第一种方法中,需要使用[0..2*N-1] 而不是[0..N-1],就像在您的第二种方法中一样?谢谢
  • @IvánRodríguezTorres 列表上下文中的哈希会产生一个键、值、键、值的列表......并且分配给一个哈希也需要这样一个列表。如果对于 100 个键,您需要此列表中的 200 个元素。
  • 完美。谢谢你的澄清
【解决方案2】:

请注意,由于哈希没有特定的顺序,因此没有什么比 前 100 对更相似。

另一个可以保护您免受错误的解决方案:

for my $i (1 .. 100) {
    my ($key, $value) = each %hashtable;
    print "$key => $value\n";
}

【讨论】:

  • 感谢您的提醒。我想从中取出前 100 对,因为我首先按值对哈希表进行排序。
  • @lam619 您不能按值(或其他任何内容)对哈希进行排序。哈希是无序的,句号。你可以做的是对键进行排序,然后遍历这个排序后的数组。
  • @Iam619 恕我直言,看起来我们这里有一个经典的 XY 问题。你有一个分数哈希(可能是'player' => 'score')格式,现在你需要打印前100名球员的分数,是这样吗?
  • @Iam619 这个特定的代码没有任何问题:如果你已经有了这个玩家分数的散列,for ((sort {...} keys)[0..99] ) 部分就很简单了。这里的“X”是关于这个散列的来源:我不禁想知道为什么它以散列(无序结构)而不是数组(有序结构)的形式返回这些信息。
  • @Iam619 这里的问题是,散列 失去 任何顺序,因为它们不是按定义排序的。我最近回答了一个关于带有额外哈希级别的哈希结构的问题,以“记住”输入顺序here
【解决方案3】:

我也是 Perl 新手,可能有更优雅的解决方案,但您可以执行以下操作:

my $i = 0;
foreach my $term (keys %hashtable) {
    ...
    do something regarding $hashtable{$term} here
    ...

    last if ($i++) == 100;    
}

【讨论】:

  • 请注意,这将获得“第一个”101 对,而不是 100。
  • 好的,我更正了一点......可能这会很好。如果您需要排序顺序,可以使用 sort { $a cmp $b} keys %hashtable 对键进行排序
猜你喜欢
  • 1970-01-01
  • 2012-09-01
  • 2015-01-10
  • 2021-12-30
  • 2020-11-24
  • 2016-07-22
  • 2013-02-12
  • 1970-01-01
  • 2014-10-17
相关资源
最近更新 更多