【问题标题】:Hash of hashes from arrays in PerlPerl 中数组的哈希值
【发布时间】:2016-05-25 17:14:58
【问题描述】:

我正在使用两个数组(一个保存键,一个保存值)在 Perl 中构建散列。我需要计算并删除重复的键/值对,以便拥有唯一的哈希。然后我必须建立一个散列形式的散列:((键,值),计数)。

我正在使用这一行从数组中构建散列。

@hash{@keys} = @values;

这将在我不想要的哈希中保留重复的键/值对。任何帮助创建散列的散列表示赞赏。谢谢。

【问题讨论】:

  • 哈希切片(您正在做的事情)是将两个有序数组压缩在一起的好方法,但我认为它不适合您要解决的问题。
  • @Mathias R. Jessen 对更好的方法有什么建议吗?
  • 不能 100% 确定您想要的哈希结构 (((key,value), count))。 Key/Value 对不能是哈希键,必须是字符串
  • 我只需要一些方法来计算键/值对的出现次数@MathiasR.Jessen
  • 你能给出一些示例数据和期望的结果吗?键冲突意味着您不能将它们切片在一起,因为这会覆盖

标签: perl hash


【解决方案1】:

假设您的数组如下所示:

my @keys   = qw/a b c a a/;
my @values = qw/1 2 3 4 1/;

就像一个简单的 for 循环一样简单:

for ($i = 0; $i < scalar @keys; $i++) {
    $hash{$keys[$i]}{$values[$i]} += 1;
}

然后您可以使用嵌套循环遍历内部值(计数):

foreach my $key (keys %hash) {
    while (my ($value, $count) = each %{ $hash{$key} } ) {
        print "$key : $value = $count\n";
    }
}

这会产生:

c : 3 = 1
a : 4 = 1
a : 1 = 2
b : 2 = 1

您可以根据需要对键进行排序:

foreach my $key (sort keys %hash) {
    # same as before 
}

得到

a : 4 = 1
a : 1 = 2
b : 2 = 1
c : 3 = 1

【讨论】:

  • 我尝试使用 foreach $item (keys %hash){ print "$item: "; foreach $iteminiitem (keys %{$hash{$item}}){ print "$iteminiitem = $hash{$item}{$iteminiitem} "; } 打印 "\n"; } 形式为: key: value = count 但输出产生 a: 1 = 1 当我希望它显示 a: 1 = 2 因为有两个值为 1 的 a 键
【解决方案2】:

您可以使用散列散列,其中每个键散列一个value =&gt; count 形式的子散列。

#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;

my @keys   = qw( k1 k1 k1 k2 k2 k3 k4 k4 k5);
my @values = qw( v1 v2 v2 v3 v4 v5 v6 v6 v7 );

my %hash;
for my $idx (0 .. $#keys) {
    $hash{ $keys[$idx] }{ $values[$idx] }++;
}

print Dumper \%hash;

【讨论】:

  • 我尝试使用 foreach $item (keys %hash){ print "$item: "; foreach $iteminitem (keys %{$hash{$item}}){ print "$iteminiitem = $hash{$item}{$iteminiitem} "; } 打印 "\n"; } 在表单中:key: value = count 并且当我希望它显示 k1: v2 = 2 时它显示 k1: v2 = 2 因为有两个 k1 键的值为 v2
  • @CSstudent:很奇怪。为我显示k1: v2 = 2 v1 = 1(在将my 添加到循环变量之后)。
猜你喜欢
  • 2012-12-07
  • 2020-07-19
  • 1970-01-01
  • 2012-08-22
  • 2013-06-24
  • 1970-01-01
  • 2016-02-21
  • 2011-07-26
  • 2011-04-20
相关资源
最近更新 更多