174 votes

Comment puis-je supprimer doublons d’un tableau en Perl ?

J’ai un tableau en Perl :

Comment supprimer les doublons du tableau ?

180voto

Greg Hewgill Points 356191

Vous pouvez faire quelque chose comme ça, comme l’a démontré en perlfaq4:

Sorties :

Si vous souhaitez utiliser un module, essayez le fonction de[](https://metacpan.org/pod/List%3a%3aMoreUtils)

129voto

John Siracusa Points 8106

La documentation Perl est livré avec une belle collection de questions-réponses. Votre question est fréquemment posée:

% perldoc -q duplicate

La réponse, copier et coller à partir de la sortie de la commande ci-dessus, apparaît ci-dessous:

Elle se trouve dans /usr/local/lib/perl5/5.10.0/pods/perlfaq4.pod
 Comment puis-je supprimer les doublons d'éléments à partir d'une liste ou d'un tableau?
 (contribution de brian d foy)

 Utiliser une table de hachage. Lorsque vous pensez que les mots "unique" ou "dupliqué", pense
 "clés de hachage".

 Si vous n'avez pas de soins sur l'ordre des éléments, vous pouvez simplement
 créer de la valeur de hachage puis d'en extraire les clés. Il n'est pas important combien vous
 créer de hachage: il suffit que vous utilisez des "clés" pour obtenir les éléments uniques.

 mon %hash = map { $_, 1 } @tableau;
 # ou d'un hachage de tranche: @hash{ @array } = ();
 # ou un foreach: $hash{$_} = 1 foreach ( @tableau );

 mon @unique = keys %hash;

 Si vous souhaitez utiliser un module, essayez le "uniq" fonction de
 "Liste::MoreUtils". Dans un contexte de liste, il renvoie les éléments uniques,
 la préservation de leur ordre dans la liste. Dans un contexte scalaire, retourne l'
 nombre d'éléments uniques.

 utilisation de la Liste::MoreUtils qw(uniq);

 mon @unique = uniq( 1, 2, 3, 4, 4, 5, 6, 5, 7 ); # 1,2,3,4,5,6,7
 mon $unique = uniq( 1, 2, 3, 4, 4, 5, 6, 5, 7 ); # 7

 Vous pouvez également passer par chaque élément et ignorer celles que vous avez vu
 avant de. Utiliser un hachage de garder une trace. La première fois que la boucle voit un
 élément, cet élément n'a pas de clé en %Vu. Le "prochain" instruction crée
 la clé et utilise immédiatement sa valeur, ce qui est "undef", de sorte que la boucle
 continue à les "pousser" et incrémente la valeur de cette clé. La prochaine
 la boucle voit que même élément, de sa clé existe dans la table de hachage et
 la valeur de cette clé est vrai (puisqu'il n'est pas 0 ou "undef"), de sorte que le
 prochaine ignore que l'itération et la boucle se passe à l'élément suivant.

 mon @unique = ();
 mon % = ();

 foreach my $elem ( @tableau )
{
 ensuite si $vu{ $elem }++;
 push @unique, $elem;
}

 Vous pouvez écrire ce plus brièvement à l'aide d'un grep, qui fait de même
chose.

 mon % = ();
 mon @unique = grep { ! $vu{ $_ }++ } @tableau;

71voto

Ranguard Points 491

Installer List::MoreUtils de CPAN

Puis dans votre code :

24voto

Xetius Points 10445

Ma façon habituelle de faire c’est :

Si vous utilisez un hachage et ajoutez les éléments au hachage. Vous avez également le bonus de savoir combien de fois chaque élément apparaît dans la liste.

8voto

Sreedhar Points 41

La variable @array est la liste avec les éléments en double

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X