【问题标题】:Perl hash multiple values for a key [duplicate]Perl散列一个键的多个值[重复]
【发布时间】:2023-03-20 16:53:01
【问题描述】:

我的哈希包含具有多个值的键(包含重复项)并保持值唯一,以便我的输出看起来。

$VAR1 = { 'One' => ['code','links','links'],
'Two' => ['indent','indent'],
};

我需要如下的哈希输出

`$VAR1 = { 'One' => ['code','links'],
'Two' => ['indent'],
};`

请指教,谢谢。

【问题讨论】:

标签: perl perl-data-structures


【解决方案1】:

您的价值观需要维持其秩序吗?如果没有,您可以只使用另一层哈希。而不是执行push @{$hash{$key}}, $value;,您只需执行$hash{$key}{$value}++; - 现在keys %{$hash{$key}} 将显示该$key 的唯一值。有时,订单匹配输入会随机出现在小集合中。通常不会发生。

但是,如果您必须维护订单,您可以使用 uniq,正如 AntonH 间接建议的那样。另一种选择,如果您不经常需要排序列表,即,如果您添加到列表中的数量超过查询,则使用散列,但添加当前顺序值以便您可以对它们进行排序。例如:

# to "push"
$hash{$key}{$value} ||= scalar keys %{$hash{$key}} + 1;

# to get the list (Schwartzian Transform method)
my @values = map { $_->[1] } sort { $a->[0] <=> $b->[0] } map {
  [ $hash{$key}{$_}, $_ ] } keys %{$hash{$key}};

然后,从这里,您可以创建一个同时执行这两项操作的数据结构 - 存储列表和散列,仅当值不在散列中时才允许添加到列表中。我假设这是 Hash::Ordered 之类的模块所做的,即使不是在纯 perl 中也是如此。

# push
unless ($hash{hashes}{$key}) {
    push @{$hash{arrays}{$key}}, $value;
    $hash{hashes}{$key}{$value} = 1;
}

# get list
my @values = @{$hash{arrays}{$key}};

请注意 - 如果您删除一个项目,您必须将其从哈希和数组中删除。

【讨论】:

    猜你喜欢
    • 2015-05-24
    • 1970-01-01
    • 2014-07-27
    • 2014-10-23
    • 2021-02-04
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多