【问题标题】:I want to use an array of elements as the keys of a hash but some of the keys are missing我想使用一个元素数组作为哈希的键,但缺少一些键
【发布时间】:2015-12-25 04:53:09
【问题描述】:
    my %seen;
    @seen{@sender} = ();
    my @merged = (@sender, grep{!exists $seen{$_}} @receiver);


    my $c1 = @merged;
    print $c1, "\n";


    @hash{@merged} = ();
    my @email = keys %hash;

    my $c2 = @email;

    print $c2, "\n";

这是我在标题中为此目的而编写的代码部分。

c1 打印 1409 而 c2 仅打印 493。 我想知道哪里出了问题,缺少近 1000 个元素(不在哈希键中)?

或者,如果我这样做:

    foreach (@merged) {
        $hash{$_} = ();
    }
    # @hash{@merged} = ();
    my @email = keys %hash;

要分配键,它仍然只给了我 493 个键,缺少近 1000 个其他键。

谢谢。

【问题讨论】:

  • 您似乎在@sender@receiver 中有重复。 (@sender 中的重复将增加 c1@receiver 中的重复将增加 c2。)
  • 是的,我愿意。但我想要实现的是:首先,合并“发送者”(1000 个值)和“接收者”(1000 个值)并消除重复项,从而创建具有 1409 个值(小于 2000 个)的“合并”。其次,使用这 1409 个值作为“散列”的键。
  • 但是“消除重复”不能正常工作。例如,如果@sender 具有("a", "a", "a") 并且@receiver 具有("a", "a"),则您会期望合并具有("a")(去重)或("a", "a", "a", "a", "a")(无去重);你的有("a", "a", "a"),这给了你差异。当您将它们用作哈希键时,这将执行正确的去重,并且仅保留 ("a"),因为 c1c2 之间的差异为 2。
  • 但是合并后的数组有 1409 个元素,感觉不错(比 2000 小很多)。为什么这会影响将键分配给哈希?为什么哈希只有 493 个键?它应该有 1409 个键。
  • 我只是演示了一个可能的场景。除非我看到数据,否则我不会确定。如果@sender 已经拥有它,您将不会从@receiver 获得任何东西,因此@receiver 中有597 个元素也在@sender 中。但是您仍然有 916 个重复项(@sender 中的多个值,或 @receiver 中的多个值) - 当您索引哈希时,它们将被折叠。

标签: arrays perl hash key


【解决方案1】:
my %seen;
@seen{@sender} = ();
my @merged = (@sender, grep{!exists $seen{$_}} @receiver);

混合了两种查找唯一值的方法,但没有做对。要获取唯一值,请将上述更改为

my %seen;
@seen{@sender} = ();
@seen{@receiver} = ();
my @merged = keys(%seen);

my %seen;
my @merged = grep !$seen{$_}++, @sender, @receiver;

后者保持秩序。

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2021-10-13
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多