【问题标题】:How do I remove duplicate values from an array in Perl? [duplicate]如何从 Perl 中的数组中删除重复值? [复制]
【发布时间】:2012-10-06 22:24:38
【问题描述】:

哈希中的每个键都有多个值。在这里,我打印每个键的值

print "$var:",join ',',@{$hash{$var}},"\n";

上述打印语句的输出为:

ABC:1,2,3,1,4,2,
DEF:9,3,4,5,3,5,

现在,我想删除值中的重复项。期望的输出是,

ABC:1,2,3,4
DEF:9,3,4,5

有人可以帮我吗?

谢谢

【问题讨论】:

    标签: perl


    【解决方案1】:

    就个人而言,我喜欢List::MoreUtils 的 uniq 处理这个问题的方式。子程序非常简单,可以直接使用,也可以通过模块使用。

    my %seen;
    my @dedupe = grep { not $seen{$_}++ } @{$hash{$var}};
    

    模块中的子程序如下所示:

    sub uniq (@) {
        my %seen = ();
        grep { not $seen{$_}++ } @_;
    }
    

    此代码保留列表的初始顺序。

    【讨论】:

    • 嗯,你一直在函数头中使用定义类型的变量吗?
    • 如果你的意思是我个人使用原型,那么答案是否定的。该子是从模块复制粘贴的。我考虑删除它,因为作为一般规则原型不应该推荐给初学者,但由于它基本上是一个引用,所以我保持原样。
    • 是的,我听说了。但我不明白,为什么人们在 CPAN 模块中使用它。
    • 嗯,他们确实有目的。另一方面,许多人无缘无故地使用它们。
    【解决方案2】:

    如果你想从数组中删除重复值,你可以使用这个

    #!/usr/bin/perl -w
    use strict;
    my @array = ('a','b','c','c','e');
    my %hash = map { $_ => 1 } @array;
    my @out = keys %hash;
    printf("%s",join(',',@out));
    

    【讨论】:

    • 此方法不保留列表的初始顺序。
    【解决方案3】:

    使用List::MoreUtils::uniq

    @$_ = uniq @$_ foreach values %hash;
    

    【讨论】:

      【解决方案4】:

      它在哈希中是无关紧要的。您想要做的是对数组中的值进行重复数据删除。

      查看List::MoreUtils模块http://search.cpan.org/dist/List-MoreUtils/中的uniq()函数

      你也可以像这样自己做:

      my %h = map {($_,1)} @array_with_dupes;
      my @deduped_array = keys %h;
      

      这在“数据:数组”下的the Perl FAQ 中有广泛的介绍。

      【讨论】:

      • DIY 解决方案不保留元素的初始顺序。
      • 这没有被指定为要求。不过,我知道你会如何推断。
      猜你喜欢
      • 2018-02-13
      • 2010-09-05
      • 2012-06-05
      • 2015-09-24
      • 2011-08-05
      • 1970-01-01
      • 2014-08-11
      • 2014-01-07
      • 2021-09-29
      相关资源
      最近更新 更多