【问题标题】:How do I obtain an array of counts in perl which includes zeros for keys which had zero count?如何在 perl 中获得一个计数数组,其中包括计数为零的键的零?
【发布时间】:2012-08-25 18:45:58
【问题描述】:

我很乐意就我在使用 perl 时遇到的这个问题提供一些建议。

如果我有一个数组并且它包含例如以下整数:

1, 2, 3, 1, 1, 1, 1, 7, 1, 4, 1, 1, 1

一旦我使用哈希计算了键的计数,键值对将是:

1 => 9, 2 => 1, 3 => 1, 4 => 1, 7 => 1

我可以将两组数字(键和值)分配给不同的数组以供以后使用,但是,如果我现在想要一个如下所示的数组:(9, 1, 1, 1, 0, 0, 1),值对应于键的位置,@ 987654324@'s 用于未出现在列表中的键,即56,我将如何在 perl 中编码?

谢谢!

【问题讨论】:

    标签: arrays perl hash key key-value


    【解决方案1】:
    use List::Util qw( max );
    
    my @a = (1, 2, 3, 1, 1, 1, 1, 7, 1, 4, 1, 1, 1);
    
    my %counts;
    ++$counts{$_} for @a;
    
    my @counts = map $counts{$_} // 0, 1..max(keys(%counts));
    

    【讨论】:

    • 感谢池上!这是一种享受 - 但是如果我的数据不是逗号分隔的,而是我使用 $filename = $ARGV[0]; 从包含一列数据的文本文件中读取数据;打开(文件,$文件名);我的@a = ; ...然后上面的代码似乎不起作用。这是为什么呢?
    • 你使用了列这个词,所以我相信你可能需要更接近 while (<FILE>) { chomp; my @a = split; ... } 的东西。如果不知道文件是什么样的,很难说清楚。
    • 初始文件是粘贴到文本文件中的一列名称,适用于 Windows。这随后使用我的 @array=; 通过计数脚本传递。我的 %count;地图{$count{$_}++ @array; print "$count{$_}\n" foreach 键 %count;这给了我一列数字-然后我想获取该输出并转换为值/频率的列/数组,这是我最初的问题。我希望这能让它更清楚
    • 嗨 ikegami - 我最终使用了一个 while 循环来管理它!非常感谢您的帮助!
    • while (my $line=) {chomp ($line);推 (@array,$line); } - 有没有更简洁的方法来做到这一点?
    【解决方案2】:

    轻松:

    my @counts = map { $_ || 0 } @hash{ 1 .. 7 };
    

    我们使用从 1 到 7 的数字对哈希进行切片。undef 为没有对应值的键返回,因此 map 将所有 Boolean-false 值变为零。

    【讨论】:

    • 我似乎得到了错误 global symbol "%hash" requires explicit package name,已将上述代码的最后一行换成这一行,但我将其换成 $maxkey 而不是 7 ,我将其定义为键数组的最大值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2018-11-25
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    相关资源
    最近更新 更多