[perl] Perl의 배열에서 중복 항목을 어떻게 제거합니까?

Perl에 배열이 있습니다.

my @my_array = ("one","two","three","two","three");

배열에서 중복을 제거하려면 어떻게합니까?



답변

perlfaq4에 설명 된대로 다음과 같은 작업을 수행 할 수 있습니다 .

sub uniq {
    my %seen;
    grep !$seen{$_}++, @_;
}

my @array = qw(one two three two three);
my @filtered = uniq(@array);

print "@filtered\n";

출력 :

one two three

당신이 모듈을 사용하려면 시도 uniq에서 기능을List::MoreUtils


답변

Perl 문서에는 멋진 FAQ 모음이 포함되어 있습니다. 자주 묻는 질문 :

% perldoc -q duplicate

위 명령의 출력에서 ​​복사하여 붙여 넣은 답변은 다음과 같습니다.

/usr/local/lib/perl5/5.10.0/pods/perlfaq4.pod에 있습니다.
 목록이나 배열에서 중복 요소를 제거하려면 어떻게해야합니까?
   (brian d foy 제공)

   해시를 사용하십시오. "고유 한"또는 "중복 된"이라는 단어를 생각할 때
   "해시 키".

   요소의 순서에 신경 쓰지 않으면 그냥 할 수 있습니다.
   해시를 만든 다음 키를 추출하십시오. 당신이 어떻게 중요하지 않습니다
   해시 만들기 : "키"를 사용하여 고유 한 요소를 가져 오면됩니다.

       내 % hash = map {$ _, 1} @array;
       # 또는 해시 슬라이스 : @hash {@array} = ();
       # 또는 foreach : $ hash {$ _} = 1 foreach (@array);

       내 @unique = 키 % hash;

   모듈을 사용하려면 "uniq"기능을 사용해보십시오.
   "List :: MoreUtils". 목록 컨텍스트에서 고유 한 요소를 반환합니다.
   목록에서 순서를 유지합니다. 스칼라 컨텍스트에서
   고유 한 요소 수

       List :: MoreUtils 사용 qw (uniq);

       내 @ 고유 = uniq (1, 2, 3, 4, 4, 5, 6, 5, 7); # 1,2,3,4,5,6,7
       내 $ unique = uniq (1, 2, 3, 4, 4, 5, 6, 5, 7); # 7

   또한 각 요소를 살펴보고 본 요소를 건너 뛸 수 있습니다
   전에. 해시를 사용하여 추적하십시오. 루프가 처음으로
   % Seen에는 해당 요소가 없습니다. "다음"문은
   키는 즉시 "undef"라는 값을 사용하므로 루프
   "푸시"로 계속 진행하여 해당 키의 값을 증가시킵니다. 다음
   루프가 동일한 요소를 볼 때 그 키는 해시에 존재합니다.
   해당 키의 값은 0이거나 "unef"가 아니기 때문에 true이므로
   next는 해당 반복을 건너 뛰고 루프는 다음 요소로 이동합니다.

       내 @ 고유 = ();
       내 % seen = ();

       내 $ elem을 @each (@array)
       {
         다음에 $ seen {$ elem} ++;
         @unique, $ elem을 밀어;
       }

   grep을 사용하여 더 짧게 작성할 수 있습니다.
   알맞은 것.

       내 % seen = ();
       내 @ 고유 = grep {! $ seen {$ _} ++} @array;


답변

CPAN의 설치 목록 :: MoreUtils

그런 다음 코드에서 :

use strict;
use warnings;
use List::MoreUtils qw(uniq);

my @dup_list = qw(1 1 1 2 3 4 4);

my @uniq_list = uniq(@dup_list);


답변

이 작업을 수행하는 일반적인 방법은 다음과 같습니다.

my %unique = ();
foreach my $item (@myarray)
{
    $unique{$item} ++;
}
my @myuniquearray = keys %unique;

해시를 사용하고 항목을 해시에 추가하는 경우. 또한 각 항목이 목록에 나타나는 횟수를 아는 보너스도 있습니다.


답변

변수 @array는 중복 요소가있는 목록입니다.

%seen=();
@unique = grep { ! $seen{$_} ++ } @array;


답변

간단한 펄 원 라이너로 할 수 있습니다.

my @in=qw(1 3 4  6 2 4  3 2 6  3 2 3 4 4 3 2 5 5 32 3); #Sample data 
my @out=keys %{{ map{$_=>1}@in}}; # Perform PFM
print join ' ', sort{$a<=>$b} @out;# Print data back out sorted and in order.

PFM 블록은 다음을 수행합니다.

@in의 데이터는 MAP에 제공됩니다. MAP는 익명의 해시를 만듭니다. 해시에서 키를 추출하여 @out으로 피드


답변

마지막 하나는 꽤 좋았습니다. 방금 약간 조정했습니다.

my @arr;
my @uniqarr;

foreach my $var ( @arr ){
  if ( ! grep( /$var/, @uniqarr ) ){
     push( @uniqarr, $var );
  }
}

아마도 이것이 가장 읽기 쉬운 방법이라고 생각합니다.