[perl]effacer répétitions dans une liste
Fermé
fifto
Messages postés
54
Date d'inscription
vendredi 24 mars 2006
Statut
Membre
Dernière intervention
15 juin 2006
-
7 avril 2006 à 15:26
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 24 sept. 2007 à 09:29
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 24 sept. 2007 à 09:29
A voir également:
- [perl]effacer répétitions dans une liste
- Liste déroulante excel - Guide
- Comment effacer une page sur word - Guide
- Liste déroulante en cascade - Guide
- Effacer les cookies - Guide
- Liste groupe whatsapp - Guide
4 réponses
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
8 avril 2006 à 06:06
8 avril 2006 à 06:06
Re,
je reviens pour expliquer un peu ce que j'ai fait (en plus vu que je n'ai pas envie de dormir...).
début du script
je reviens pour expliquer un peu ce que j'ai fait (en plus vu que je n'ai pas envie de dormir...).
début du script
#! /usr/bin/perl use warnings; use strict; my @nbr = qw(12 33 33 33 77 45 77 24 21); my %deja_vu; map{ $deja_vu{$_}++ } @nbr; my @unique = sort keys %deja_vu; #affichage print "@unique\n"; # donc affichage des éléments du tableau print "@{ [ sort keys %deja_vu ] }\n"; # interpolation d’une expression # $ ou @ peut être interpoler dans une chaîne entre guillemets # le contenu de notre hachage %deja_vu foreach (sort keys %deja_vu) { print "L'élément $_ => $deja_vu{$_} fois\n"; } # affichage avec each (pas de tri mais bien plus rapide) while ( my($cle,$val) = each %deja_vu ) { print "$cle = > $val fois\n"; } __END__ Pourquoi hachage pour résoudre le problème d'unicité? Puisque hachage c'est un type de variable Perl qui contient des données qui peuvent être appelées par un nom (une clé) qui est unique en comparaison avec les éléments d'un tableaux qui sont indexés par un nombre : array[0], array[1]..... La clé d'un hachage est unique (comme une clé primaire dans mysql). Les clés d'un hash peuveut être récupérées avec keys %hash et le valeurs avec values %hash. Donc dans un hachage on a un couple clé => valeur => c'est une virgule magique (son utilisation a 2 raison : - l'élément qui est à gauche est traité comme une chaîne - pour lisibilité (qui parle d'illisible en Perl?!) "Perl n'est pas moins lisible que le chinois pour les français. Mais ça ne pose pas des problèmes ni pour les Perliens ni pour les Chinois. Pour les autres oui." En ce cas il nous reste à utiliser un hachage, on parcours chaque élément du tableau et pour chaque élément du tableau on incrémente sur la valeur de la clé du hachage. Donc pour chaque élément du tableau on incrémente. Si l'élément du tableau n'est pas unique (vu que la clé d'un hash en est......) $hash{'12'}++ # pour l'instant vaut 1 et la valeur restera 1 (donc une fois) si 12 est unique $hash{'33'}++ # pareil $hash{'33'}++ # vaut 2 $hash{'33'}++ # vaut 3 etc..... J'ai rajouté dans le code (avant __END__) pour voir le résultat. En final on aura les clés du hash qui sont en fait les éléments uniques de notre liste et les valeurs qui représente combien on a de chaque. foreach (sort keys %hash) { print "$_ => $hash{$_}\n"; } Si on n'a pas besoin de trier le hachage mieux vaut utiliser "each" while ( my($cle,$val) = each %hash ) { print "$cle = > $val fois\n"; } ______________________________________ Tout ce qui est écrit après END n'est pas traité par l'interpréteur Perl (mais peut être lu par le handle de fichier DATA) Ex : while(<DATA>) { print; # affichage des lignes contenu après END }fin du script
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
7 avril 2006 à 16:15
7 avril 2006 à 16:15
Salut,
si on ne pense pas en hachage alors on ne pense pas en perl.
ou
si on ne pense pas en hachage alors on ne pense pas en perl.
#! /usr/bin/perl use warnings; use strict; my @nbr = qw(12 33 33 33 77 45 77 24 21); my %deja_vu; foreach (@nbr) { $deja_vu{$_}++; } print sort keys %deja_vu;
ou
#! /usr/bin/perl use warnings; use strict; my @nbr = qw(12 33 33 33 77 45 77 24 21); my %deja_vu; map{ $deja_vu{$_}++ } @nbr; print sort keys %deja_vu;
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
7 avril 2006 à 19:52
7 avril 2006 à 19:52
Re,
pour un meilleur affichage
pour un meilleur affichage
#! /usr/bin/perl use warnings; use strict; my @nbr = qw(12 33 33 33 77 45 77 24 21); my %deja_vu; map{ $deja_vu{$_}++ } @nbr; print "@{ [ sort keys %deja_vu ] }\n";Si tu veux stocker les valeurs pour une utilisation ultérieure
#! /usr/bin/perl use warnings; use strict; my @nbr = qw(12 33 33 33 77 45 77 24 21); my %deja_vu; map{ $deja_vu{$_}++ } @nbr; my @unique = sort keys %deja_vu; print "@unique\n";
Topic qui date un peu, mais qui m'a aidé.
Donc je laisse un mot pour remercier Lami20j qui m'a bien aidé avec ses explications que n'importe qui, même completement noob, comprendrait.
Donc je laisse un mot pour remercier Lami20j qui m'a bien aidé avec ses explications que n'importe qui, même completement noob, comprendrait.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
24 sept. 2007 à 09:29
24 sept. 2007 à 09:29
Salut,
avec plaisir ;-)
avec plaisir ;-)