重複する要素を取り除く
Posted feedbacks - Perl
そうか!お題には「 重複する要素を取り除く」としか書いてない(笑 ということで順序は壊れるし効率もわるいけど。。。 こんなのもあり?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | sub eraseDuplicate(@)
{
$_ = join(' ', sort(@_));
s/([^ ]+ )\1+//g;
return split(' ');
}
my @sample = (3, 1, 4, 1, 5, 9, 2, 6, 5);
print '入力:[' . join(', ', @sample) . "]\n";
@sample = &eraseDuplicate( @sample );
print '出力:[' . join(', ', @sample) . "]\n";
exit 0;
|
一手間かけて順序保持するように修正~ だけど、文字列(単語)の重複含めて排除するでもない限りは 使い物にならないかなと(笑
1 2 3 4 5 6 7 8 9 10 11 | sub eraseDuplicate(@)
{
my @out;
my $a = ' ' . join(' ', sort(@_)) . ' ';
$a =~ s/([^ ]+ )\1+//g;
foreach my $b ( @_ )
{
push(@out, $1) if( $a =~ m/ ($b) / );
}
return @out;
}
|
無理やりワンライナーでやってみた 指定はなかったが一応配列の順番も保障。
1 2 3 4 5 | my @array = (3, 1, 4, 1, 5, 9, 2, 6, 5);
my @array2 = do { my %hash; grep { $hash{$_} == 1 } map { $hash{$_}++; $_; } @array };
print join ', ', @array2;
|
fbisさん惜しい!uniqは
sub uniq{ my %u; grep {!$u{$_}++} @_}
というidiomがすでにあるのです。
Dan the Perl Monger
see: 配列操作の比較表: Ruby, Python, JavaScript, Perl, C++
1 2 | % perl -le 'print do{my %u; grep {\!$u{$_}++} @ARGV}' 1 2 1 2 3 1 2 3 4
1234
|




にしお
#3412()
Rating1/1=1.00
これはアレイのuniqの派生問題です。 リストとかアレイという言葉は言語によってまちまちの意味で使われているので、 「配列のようなもの」という漠然とした意味にとって構いません。
[ reply ]