Perlに配列があります:
my @my_array = ("one","two","three","two","three");
配列から重複を削除するにはどうすればよいですか?
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
上記のコマンドの出力からコピーして貼り付けた答えは、以下に表示されます。
リストまたは配列から重複する要素を削除するにはどうすればよいですか? (brian d foyによる寄稿)
ハッシュを使用します。「ユニーク」または「重複」という言葉を考えるときは、「ハッシュキー」を考えてください。
要素の順序を気にしない場合は、ハッシュを作成してからキーを抽出するだけです。そのハッシュをどのように作成するかは重要ではありません。「キー」を使用して一意の要素を取得するだけです。
my %hash = map { $_, 1 } @array;
# or a hash slice: @hash{ @array } = ();
# or a foreach: $hash{$_} = 1 foreach ( @array );
my @unique = keys %hash;
モジュールを使用する場合は、「List::MoreUtils」の「uniq」関数を試してください。リストコンテキストでは、一意の要素を返し、リスト内の順序を保持します。スカラーコンテキストでは、一意の要素の数を返します。
use List::MoreUtils qw(uniq);
my @unique = uniq( 1, 2, 3, 4, 4, 5, 6, 5, 7 ); # 1,2,3,4,5,6,7
my $unique = uniq( 1, 2, 3, 4, 4, 5, 6, 5, 7 ); # 7
また、各要素を調べて、前に見た要素をスキップすることもできます。追跡するためにハッシュを使用します。ループが要素を初めて見たとき、その要素は%Seenにキーを持っていません。「next」ステートメントはキーを作成し、すぐにその値「undef」を使用するため、ループは「push」に進み、そのキーの値をインクリメントします。次回ループが同じ要素を検出すると、そのキーはハッシュに存在し、そのキーの値はtrue(0または "undef"ではないため)であるため、nextはその反復をスキップし、ループは次の要素に進みます。
my @unique = ();
my %seen = ();
foreach my $elem ( @array )
{
next if $seen{ $elem }++;
push @unique, $elem;
}
同じことを行うgrepを使用して、これをより簡単に記述できます。
my %seen = ();
my @unique = grep { ! $seen{ $_ }++ } @array;
List::MoreUtilsを CPAN からインストールする
次に、コードで:
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;
ハッシュを使用し、アイテムをハッシュに追加する場合。また、各アイテムがリストに表示される回数を知るというボーナスもあります.
単純なPerlワンライナーで実行できます。
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
匿名ハッシュを作成します。 keys
ハッシュから抽出され、にフィードされます@out
変数@array
は要素が重複しているリストです
%seen=();
@unique = grep { ! $seen{$_} ++ } @array;
あのラストはかっこよかった。少し微調整します:
my @arr;
my @uniqarr;
foreach my $var ( @arr ){
if ( ! grep( /$var/, @uniqarr ) ){
push( @uniqarr, $var );
}
}
これがおそらく最も読みやすい方法だと思います。