Ich habe ein Array in Perl:
my @my_array = ("one","two","three","two","three");
Wie entferne ich die Duplikate aus dem Array?
perl
arrays
unique
duplicates
David
quelle
quelle
my
lexikalische in diesem Bereich, so ist es in Ordnung. Davon abgesehen könnte möglicherweise ein aussagekräftigerer Variablenname gewählt werden.$::a
und$::b
, nicht wahr ?sub uniq { my %seen; grep !$seen{$_}++, @_ }
ist eine bessere Implementierung, da die Ordnung kostenlos erhalten bleibt. Oder noch besser, verwenden Sie die von List :: MoreUtils.Die Perl-Dokumentation enthält eine schöne Sammlung von FAQs. Ihre Frage wird häufig gestellt:
Die Antwort, die aus der Ausgabe des obigen Befehls kopiert und eingefügt wurde, wird unten angezeigt:
quelle
Installieren Sie List :: MoreUtils von CPAN
Dann in Ihrem Code:
quelle
@dup_list
sollte innerhalb desuniq
Anrufs sein, nicht@dups
Meine übliche Vorgehensweise ist:
Wenn Sie einen Hash verwenden und die Elemente zum Hash hinzufügen. Sie haben auch den Bonus zu wissen, wie oft jedes Element in der Liste angezeigt wird.
quelle
foreach
Loop zu verwenden:@unique{@myarray}=()
Die Variable @array ist die Liste mit doppelten Elementen
quelle
Kann mit einem einfachen Perl One Liner durchgeführt werden.
Der PFM-Block führt Folgendes aus:
Daten in @in werden in MAP eingespeist. MAP erstellt einen anonymen Hash. Schlüssel werden aus dem Hash extrahiert und in @out eingegeben
quelle
Das letzte war ziemlich gut. Ich würde es nur ein bisschen optimieren:
Ich denke, dies ist wahrscheinlich der am besten lesbare Weg, dies zu tun.
quelle
Methode 1: Verwenden Sie einen Hash
Logik: Ein Hash kann nur eindeutige Schlüssel haben. Iterieren Sie also über das Array, weisen Sie jedem Element des Arrays einen beliebigen Wert zu und behalten Sie das Element als Schlüssel für diesen Hash bei. Geben Sie die Schlüssel des Hashs zurück, es ist Ihr einzigartiges Array.
Methode 2: Erweiterung von Methode 1 zur Wiederverwendbarkeit
Es ist besser, eine Unterroutine zu erstellen, wenn wir diese Funktionalität in unserem Code mehrmals verwenden sollen.
Methode 3: Modul verwenden
List::MoreUtils
quelle
Frühere Antworten fassen die möglichen Wege zur Erfüllung dieser Aufgabe ziemlich gut zusammen.
Allerdings schlage ich eine Änderung für diejenigen , die nicht über Pflege zählen die Duplikate, aber nicht kümmern uns um Ordnung.
Beachten Sie, dass die zuvor vorgeschlagenen
grep !$seen{$_}++ ...
Inkremente$seen{$_}
vor dem Negieren ausgeführt werden, sodass das Inkrement unabhängig davon erfolgt, ob es bereits vorhanden war%seen
oder nicht. Das oben Gesagte schließt jedoch kurz, wenn$record{$_}
es wahr ist, und lässt das, was einmal gehört wurde, "aus%record
".Sie könnten sich auch für diese Lächerlichkeit entscheiden, die die Autovivifizierung und das Vorhandensein von Hash-Schlüsseln ausnutzt:
Dies könnte jedoch zu Verwirrung führen.
Und wenn Sie sich weder für die Reihenfolge noch für die doppelte Anzahl interessieren, können Sie für einen weiteren Hack Hash-Slices und den Trick verwenden, den ich gerade erwähnt habe:
quelle
sub uniq{ my %seen; undef @seen{@_}; keys %seen; }
Ordentlich.Versuchen Sie dies, anscheinend benötigt die Uniq-Funktion eine sortierte Liste, um ordnungsgemäß zu funktionieren.
quelle
Verwenden des Konzepts eindeutiger Hash-Schlüssel:
Ausgabe: acbd
quelle