Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

[perl]effacer répétitions dans une liste

fifto, le vendredi 7 avril 2006 à 15:26:19
Bonjour,

j'aimerais effacer les éléments (de type nombre) d'une liste qui se repetent en perl, et les ordonner.

C'est à dire que si ma liste est par exemple:
12 33 33 33 77 45 77 24 21

j'aimerais qu'elle devienne
12 21 24 33 45 77

C'est À dire que les deux 33 en trop ont dégagés ainsi que le 77 en trop. Et la liste est triée du plus petit au plus grand.

Qqn peut me donner une idée ?

merci.
Répondre à fifto  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le vendredi 7 avril 2006 à 16:15:41
Salut,

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;
Répondre à lami20j

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le vendredi 7 avril 2006 à 19:52:12
Re,

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";
Répondre à lami20j

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le samedi 8 avril 2006 à 06:06:49
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
#! /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
Répondre à lami20j

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Artis, le lundi 24 septembre 2007 à 02:53:36
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.
Répondre à Artis

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 lami20j, le lundi 24 septembre 2007 à 09:29:03
Salut,

avec plaisir ;-) lami20j
Répondre à lami20j

Résultats pour [perl]effacer répétitions dans une liste

Comment effacer ma liste rouge sur msn (Résolu) Bonjour, a tous, en faite j'aurai besoin de quelqu'un qui me dise si c'est possible ou pas d'effacer la liste rouge de msn, qui ce situe dans la fenètre ou on choisit son statut, dans options, puis confidentialité. si oui dites moi... www.commentcamarche.net/forum/affich-5971140-comment-effacer-ma-liste-rouge-sur-msn
Effacer la liste des mots ds la barre GOOGLE (Résolu) Bonjour tout le monde, Je voulais effacer la liste des mots et d'adresse site ds le logiciel de recherche GOOGLE et je ne sais comment? www.commentcamarche.net/forum/affich-3939713-effacer-la-liste-des-mots-ds-la-barre-google
Effacer les login memorise ds la liste (Résolu) Bonjour, sur un site, il y a la zone identifiez-vous 1ere info : login, 2eme info : password si je tape les 1eres lettres ds la zone login, se deroule alors toute la liste des logins precedents je voudrais effacer cette liste . je ne voudrais voir que... www.commentcamarche.net/forum/affich-4277746-effacer-les-login-memorise-ds-la-liste

Résultats pour [perl]effacer répétitions dans une liste

[Windows] Obtenir la liste des fichiers d'un dossierLister le contenu d'un dossier Voici une astuce simple qui permet de lister le nom des fichiers contenus dans un répertoire. Vous pourrez obtenir en un clic les titres de vos chansons, de vos photos, etc. dans un fichier... www.commentcamarche.net/faq/sujet-2662-windows-obtenir-la-liste-des-fichiers-d-un-dossier
[Gravure] Effacer un disque réinscriptible (CD-RW/DVD-RW/DVD+RW)Il n'est pas nécessaire de formater un disque réinscriptible lors de la première utilisation. Néanmoins, lorsque des données ont été gravées sur le support réinscriptible et qu'il ne reste plus d'espace disponible, il est nécessaire de les effacer... www.commentcamarche.net/faq/sujet-2642-gravure-effacer-un-disque-reinscriptible-cd-rw-dvd-rw-dvd-rw
[MS-Dos] Lister le contenu d'un répertoire dans un fichierIl peut s'avérer pratique d'effectuer le listage d'un ou plusieurs répertoires dans un fichier, afin de tenir par exemple un catalogue de fichiers. Sous MS-Dos (ou sous Windows en ouvrant une fenêtre d'invite de commande MS-Dos) il est possible... www.commentcamarche.net/faq/sujet-948-ms-dos-lister-le-contenu-d-un-repertoire-dans-un-fichier

Résultats pour [perl]effacer répétitions dans une liste

Effacer les discussion résolu (Résolu)Bonjour,comment on fait d'une fois con a résolu nos problème pour effacer la liste des discussion dans (nos intervention)?merci www.commentcamarche.net/forum/affich-6223238-effacer-les-discussion-resolu
Barre d'adresse (Résolu)Bonjour. Quelqu'un sait -il comment, sur IE, FireFox, et sur la barre google, effacer la liste de sites et ,pour google, de mots, que l'on a taper??? Merci encore de vous occupez de mes problèmes. ;-) Au revoir www.commentcamarche.net/forum/affich-1409808-barre-d-adresse
[Question] (Résolu)Salut c'est juste pour une question : Je voudrai savoir comment on fait pour effacer la liste d'historique de google avec wanadoo ? Merci www.commentcamarche.net/forum/affich-1939935-question

Résultats pour [perl]effacer répétitions dans une liste

Télécharger Ma Liste d'Achats Faire les courses est une tâche bien compliquée pour les non initiés. Ma liste d'achats est comme son nom l'indique, un programme qui vous aidera à concevoir votre liste d'achat. Il fonctionne un comme une pense bête, mais en plus élaborée. Il... www.commentcamarche.net/telecharger/telecharger-34055798-ma-liste-d-achats

Résultats pour [perl]effacer répétitions dans une liste

Listes et énumérations en HTMLLes listes Une liste est un paragraphe structuré contenant une suite d'articles. Le langage HTML définit trois types de listes : La liste ordonnée ; La liste non ordonnée ; La liste de définition. Liste ordonnée Conteneur Type de... www.commentcamarche.net/contents/html/htmllistes.php3
Perl - Les fichiersLa notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles... www.commentcamarche.net/contents/perl/perlfich.php3
Listes de diffusion (mailing lists)Notion de liste de diffusion Une liste de diffusion (en anglais mailing-list) est un des services les plus couramment utilisés sur internet, permettant à un expéditeur d'envoyer un message à un ou plusieurs destinataires. Le courrier électronique a... www.commentcamarche.net/contents/courrier-electronique/listes-diffusion.php3