J'ai un tableau en Perl:
my @my_array = ("one","two","three","two","three");
Comment supprimer les doublons du tableau?
perl
arrays
unique
duplicates
David
la source
la source
my
lexical dans ce domaine, donc ça va. Cela étant dit, un nom de variable plus descriptif pourrait être choisi.$::a
et$::b
, n'est-ce pas?sub uniq { my %seen; grep !$seen{$_}++, @_ }
est une meilleure implémentation car elle préserve l'ordre sans frais. Ou mieux encore, utilisez celui de List :: MoreUtils.La documentation Perl est fournie avec une belle collection de FAQ. Votre question est fréquemment posée:
La réponse, copiée et collée à partir de la sortie de la commande ci-dessus, apparaît ci-dessous:
la source
Liste d' installation :: MoreUtils du CPAN
Puis dans votre code:
la source
@dup_list
devrait être à l'intérieur de l'uniq
appel, pas@dups
Ma façon habituelle de faire ceci est:
Si vous utilisez un hachage et ajoutez les éléments au hachage. Vous avez également l'avantage de savoir combien de fois chaque élément apparaît dans la liste.
la source
foreach
boucle:@unique{@myarray}=()
La variable @array est la liste des éléments en double
la source
Peut être fait avec une simple doublure Perl one.
Le bloc PFM fait ceci:
Les données dans @in sont introduites dans MAP. MAP crée un hachage anonyme. Les clés sont extraites du hachage et alimentées dans @out
la source
Ce dernier était plutôt bon. Je le peaufinerais juste un peu:
Je pense que c'est probablement la manière la plus lisible de le faire.
la source
Méthode 1: utiliser un hachage
Logique: un hachage ne peut avoir que des clés uniques, donc itérer sur un tableau, attribuer une valeur à chaque élément du tableau, en gardant l'élément comme clé de ce hachage. Retournez les clés du hachage, c'est votre tableau unique.
Méthode 2: Extension de la méthode 1 pour la réutilisabilité
Mieux vaut créer un sous-programme si nous sommes censés utiliser cette fonctionnalité plusieurs fois dans notre code.
Méthode 3: utiliser le module
List::MoreUtils
la source
Les réponses précédentes résument assez bien les moyens possibles d'accomplir cette tâche.
Cependant, je suggère une modification pour ceux qui ne se soucient pas de compter les doublons, mais qui se soucient de l'ordre.
Notez que les
grep !$seen{$_}++ ...
incrémentations suggérées précédemment$seen{$_}
avant de négocier, l'incrémentation se produit indépendamment du fait qu'il ait déjà été%seen
ou non. Ce qui précède, cependant, court-circuit quand$record{$_}
est vrai, laissant ce qui a été entendu une fois «hors du%record
».Vous pouvez également opter pour ce ridicule, qui tire parti de l'autovivification et de l'existence de clés de hachage:
Cela pourrait toutefois prêter à confusion.
Et si vous ne vous souciez ni de l'ordre ni du nombre de doublons, vous pouvez utiliser un autre hack en utilisant des tranches de hachage et l'astuce que je viens de mentionner:
la source
sub uniq{ my %seen; undef @seen{@_}; keys %seen; }
Neat.Essayez ceci, il semble que la fonction uniq ait besoin d'une liste triée pour fonctionner correctement.
la source
Utilisation du concept de clés de hachage uniques:
Sortie: acbd
la source