Saya memiliki array di Perl:
my @my_array = ("one","two","three","two","three");
Bagaimana cara menghapus duplikat dari array?
perl
arrays
unique
duplicates
David
sumber
sumber
my
leksikal dalam lingkup ini, jadi tidak masalah. Karena itu, mungkin nama variabel yang lebih deskriptif dapat dipilih.$::a
dan$::b
, bukan?sub uniq { my %seen; grep !$seen{$_}++, @_ }
adalah implementasi yang lebih baik karena menjaga ketertiban tanpa biaya. Atau bahkan lebih baik, gunakan yang dari Daftar :: MoreUtils.Dokumentasi Perl dilengkapi dengan koleksi FAQ yang bagus. Pertanyaan Anda sering diajukan:
Jawaban, salin dan tempel dari output dari perintah di atas, muncul di bawah ini:
sumber
Pasang Daftar :: MoreUtils dari CPAN
Kemudian dalam kode Anda:
sumber
@dup_list
harus ada di dalamuniq
panggilan, bukan@dups
Cara biasa saya melakukan ini adalah:
Jika Anda menggunakan hash dan menambahkan item ke hash. Anda juga memiliki bonus untuk mengetahui berapa kali setiap item muncul dalam daftar.
sumber
foreach
loop:@unique{@myarray}=()
Variabel @array adalah daftar dengan elemen duplikat
sumber
Dapat dilakukan dengan Perl satu liner sederhana.
Blok PFM melakukan ini:
Data dalam @in dimasukkan ke dalam MAP. MAP membangun hash anonim. Kunci diekstraksi dari hash dan diumpankan ke @out
sumber
Yang terakhir itu cukup bagus. Saya hanya akan men-tweak sedikit:
Saya pikir ini mungkin cara yang paling mudah dibaca untuk melakukannya.
sumber
Metode 1: Gunakan hash
Logika: Sebuah hash hanya dapat memiliki kunci unik, jadi iterate over array, tetapkan nilai apa pun untuk setiap elemen array, jadikan elemen sebagai kunci hash itu. Kembalikan kunci hash, ini array unik Anda.
Metode 2: Perpanjangan metode 1 untuk dapat digunakan kembali
Lebih baik membuat subrutin jika kita seharusnya menggunakan fungsi ini beberapa kali dalam kode kita.
Metode 3: Gunakan modul
List::MoreUtils
sumber
Jawaban sebelumnya cukup meringkas cara yang mungkin untuk menyelesaikan tugas ini.
Namun, saya menyarankan modifikasi bagi mereka yang tidak peduli tentang menghitung duplikat, tetapi melakukan perawatan tentang pesanan.
Perhatikan bahwa
grep !$seen{$_}++ ...
kenaikan yang disarankan sebelumnya$seen{$_}
sebelum dinegasikan, sehingga peningkatan terjadi terlepas dari apakah sudah%seen
atau belum. Di atas, bagaimanapun, korsleting ketika$record{$_}
benar, meninggalkan apa yang terdengar sekali dari%record
'.Anda juga bisa menggunakan kekonyolan ini, yang memanfaatkan autovivifikasi dan keberadaan kunci hash:
Namun, itu bisa menimbulkan kebingungan.
Dan jika Anda tidak peduli dengan urutan atau jumlah duplikat, Anda dapat melakukan retasan menggunakan irisan hash dan trik yang baru saja saya sebutkan:
sumber
sub uniq{ my %seen; undef @seen{@_}; keys %seen; }
Rapi.Coba ini, sepertinya fungsi uniq membutuhkan daftar yang diurutkan untuk berfungsi dengan baik.
sumber
Menggunakan konsep kunci hash yang unik:
Output: acbd
sumber