Mam tablicę w Perlu:
my @my_array = ("one","two","three","two","three");
Jak usunąć duplikaty z tablicy?
perl
arrays
unique
duplicates
David
źródło
źródło
my
tym zakresie jest leksykalny, więc jest w porządku. Biorąc to pod uwagę, prawdopodobnie można wybrać bardziej opisową nazwę zmiennej.$::a
i$::b
, prawda?sub uniq { my %seen; grep !$seen{$_}++, @_ }
jest lepszą implementacją, ponieważ zachowuje porządek bez żadnych kosztów. Lub jeszcze lepiej, użyj tego z List :: MoreUtils.Dokumentacja Perla zawiera niezłą kolekcję często zadawanych pytań. Twoje pytanie jest często zadawane:
Odpowiedź, skopiuj i wklej z wyniku powyższego polecenia, pojawia się poniżej:
źródło
Lista instalacji :: MoreUtils z CPAN
Następnie w swoim kodzie:
źródło
@dup_list
powinno być wewnątrzuniq
rozmowy, a nie@dups
Mój zwykły sposób to:
Jeśli używasz hasha i dodajesz elementy do hasha. Masz również bonus, wiedząc, ile razy każdy element pojawia się na liście.
źródło
foreach
pętli:@unique{@myarray}=()
Zmienna @array to lista ze zduplikowanymi elementami
źródło
Można to zrobić za pomocą prostego jednego wkładu Perl.
Blok PFM robi to:
Dane w @in są wprowadzane do MAP. MAP buduje anonimowy hash. Klucze są wyodrębniane z skrótu i przesyłane do @out
źródło
Ten ostatni był całkiem niezły. Po prostu trochę go poprawię:
Myślę, że jest to prawdopodobnie najbardziej czytelny sposób, aby to zrobić.
źródło
Metoda 1: Użyj skrótu
Logika: Hash może mieć tylko unikalne klucze, więc iteruj po tablicy, przypisz dowolną wartość do każdego elementu tablicy, zachowując element jako klucz tego skrótu. Klucze zwrotne skrótu, to twoja unikalna tablica.
Metoda 2: Rozszerzenie metody 1 o możliwość ponownego wykorzystania
Lepiej zrobić podprogram, jeśli mamy używać tej funkcji wiele razy w naszym kodzie.
Metoda 3: Użyj modułu
List::MoreUtils
źródło
Poprzednie odpowiedzi w dużym stopniu podsumowują możliwe sposoby wykonania tego zadania.
Jednak proponuję modyfikację dla tych, którzy nie dbają o liczenie duplikaty, ale zrobić dbają o zamówieniu.
Zwróć uwagę, że poprzednio sugerowane
grep !$seen{$_}++ ...
przyrosty$seen{$_}
przed zaprzeczeniem, więc przyrost zachodzi niezależnie od tego, czy już był,%seen
czy nie. Powyższe jednak$record{$_}
powoduje zwarcia, gdy jest prawdą, pozostawiając to, co kiedyś usłyszano%record
.Możesz też pójść na tę śmieszność, która wykorzystuje autowifikację i istnienie kluczy mieszających:
Może to jednak prowadzić do pewnego zamieszania.
A jeśli nie obchodzi Cię ani kolejność, ani liczba duplikatów, możesz zrobić kolejny hack za pomocą plastrów z krzyżykiem i sztuczki, o której wspomniałem:
źródło
sub uniq{ my %seen; undef @seen{@_}; keys %seen; }
schludnie.Spróbuj tego, wygląda na to, że funkcja uniq wymaga posortowanej listy, aby działać poprawnie.
źródło
Korzystanie z koncepcji unikalnych kluczy skrótu:
Wyjście: acbd
źródło