【问题标题】:How to push duplicate element of an array to a new array perl如何将数组的重复元素推送到新数组perl
【发布时间】:2012-07-10 18:39:36
【问题描述】:

谁能告诉我如何将数组的重复元素推送到新数组? 这就是我到目前为止所拥有的,我想再次将重复的元素保留到一个新的数组中。

%seen = ();
@uniq = ();
foreach $item (@list) {
    unless ($seen{$item}) {
        $seen{$item} = 1;
        push(@uniq, $item);
    }
}
print "@unique\n";

【问题讨论】:

  • 您是按照您的文本所述尝试查找重复项,还是按照您的代码所述尝试删除重复项?

标签: perl


【解决方案1】:

始终以use strict;use warnings; 开始您的脚本。

use strict ;
use warnings ;

my @list = ( 1 .. 10 , 2 , 5 , 6 ) ;

my %seen = ();
foreach my $item (@list) {
  $seen{$item}++ ;
}

my @uniq = grep { $seen{$_} == 1 } keys %seen ;
my @not_unique = grep { $seen{$_} > 1 } keys %seen ;

只需计算哈希中元素的每次出现次数,然后使用 grep。

【讨论】:

    【解决方案2】:

    不清楚您要完成什么...您要删除重复项还是找到它们?以下是两者的解决方案:

    删除重复项

    use strict;
    use warnings;
    
    my @list = (1,2,3,4,5,6,1,2,3);
    
    my %unique;
    @unique{ @list } = ();
    print join(',',sort keys %unique)."\n";
    

    输出:

    1,2,3,4,5,6

    只抓取重复项

    use strict;
    use warnings;
    
    my @list = (1,2,3,4,5,6,1,2,3);
    
    my %dupes;
    %dupes = map { $_ => $dupes{$_}++ } @list;
    delete @dupes{ grep { $dupes{$_} == 0 } keys %dupes };
    print join(',',sort keys %dupes)."\n";
    

    输出:

    1,2,3

    【讨论】:

    • sub uniq { my %seen; grep ! $seen{$_}++, @_ } 将保持列表的顺序,sub dupe { my %seen; grep $seen{$_}++, @_ }
    • @Zaid:一个不错的补充。谢谢!
    【解决方案3】:

    如果您要查找多次出现的值:

    my @seen;
    my @dups = grep ++$seen{$_} == 2, @list;
    

    @list = qw( foo bar baz foo foo moo bar );
      gives
    @dups = qw( foo bar );
    

    如果您尝试将仅在@uniq 中找到一次的值以及在@dups 中找到两次或更多的值:

    my %counts; 
    ++$counts{$_} for @list;
    
    my (@uniq, @dups);
    for (@list) {
       my $count = $counts{$_};
       push @uniq, $_ if $count == 1;
       push @dups, $_ if $count == 2;
    }
    

    @list = qw( foo bar baz foo foo moo bar );
      gives
    @uniq = qw( baz moo );
    @dups = qw( foo bar );
    

    如果您尝试将值的第一个实例放入 @uniq 并将第二个和后续值放入 @dups

    my (@uniq, @dups, %seen);
    push @{ $seen{$_}++ ? \@dups : \@uniq }, $_ for @list;
    

    @list = qw( foo bar baz foo foo moo bar );
      gives
    @uniq = qw( foo bar baz moo );
    @dups = qw( foo foo bar );
    

    【讨论】:

      【解决方案4】:

      与您的逻辑相同,但陈述不同。

      use strict;
      my @ar = (1,2,3,4,1,2);
      my %ar = map { $_ ,  1 } @ar ;
      my @ar1 = keys %ar;
      
      print @ar1;
      

      Also check this

      【讨论】:

        【解决方案5】:

        消除重复就是这么简单:

        use List::MoreUtils qw<uniq>;
        
        my @uniq = uniq @list;
        

        获取重复项,需要更明确的 Perl:

        my %seen;
        my @dups = grep { ++$seen{ '' . $_ } == 2 } @list;
        

        【讨论】:

          【解决方案6】:

          必须始终在程序开始时使用use strictuse warnings,并在首次使用时使用my 声明所有变量。在这种情况下,它会显示您正在向数组 @uniq 添加数据,但显示的是 @unique 的内容。

          此程序将打印所有唯一数据项的列表,以及出现两次或更多次的数据的第二个列表

          use strict;
          use warnings;
          
          my @list = qw/ a a a b b c /;
          
          my %seen;
          my @uniq;
          my @multiple;
          
          foreach my $item (@list) {
            if (not $seen{$item}++) {
              push @uniq, $item;
            }
            elsif ($seen{$item} == 2) {
              push @multiple, $item;
            }
          }
          print "Unique: @uniq\n";
          print "Multiple: @multiple\n";
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-12-23
            • 1970-01-01
            • 1970-01-01
            • 2016-01-20
            • 1970-01-01
            • 2020-07-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多