Suppression de doublons - PERL [Fermé]

Signaler
-
 bheadman -
slt tlm,

je voulais avoir votre avis sur la meilleure façon de procéder pour supprimer d'une liste de chaine de caractere les doublons...

ce que je fais pour l'instant (c'est pas terrible et cest bien pour ca que je poste ;)

1) je les stockes dans un tableau simple (pas associatif)

push(@stock, $elem);

2) je les tries

@stock=sort(@stock);

3)je passe tout les éléments en revue et je regarde si le suivant est identique. Si identique, je lui affecte la valeur ""


for ($i=0; $i < @stock; $i++)
{
if(@stock>$i+1)
{
($stock[$i]eq$stock[$i+1])?$stock[$i]='':$stock[$i];
}
}


4) je retries (je vous avais prévenu... cest vraiment pas terrible mon algo) :(

@stock=sort(@stock);

5) ensuite, rebelotte, je parcours le tableau tout en supprimant les éléments quand je rencontre une chaine de caractere nulle... si je rencontre qque chose de différent je sort...

while (@sender[0]eq'')
{
shift(@sender);
if (!@sender)
{
last;
}
}


... tout ca pour virer les doublons.... :(
donc si quelqun vois une maniere plus optimisé que la mienne ....du style qu'il me sorte une fonction dans perl eradikerdoublons() ou (car jai cherché, elle existe pas cette super fonction dans perl ;) améliorer mon algo ... ca serai sympa qu'il mexplique comment ;)

6 réponses

voici une solution

my (%saw,@out)=();
undef %saw;
@out = sort(grep(!$saw{$_}++, @stock));

le tableau @out possède la liste sans les doublons.
10
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
2898
Date d'inscription
jeudi 26 avril 2001
Statut
Membre
Dernière intervention
21 mars 2013
502
J'ai eu la même idée que sebsauvage, utiliser un tableau de HASH.


my %h_senders;
boucle sur les elements (condition) { # A toi de la definir
$h_senders[$elem]++;
}


Au passage, ça te permet de connaitre le nombre d'occurence de l'élément (grace à l'incrémentation).

Donc si tu affiches :

print $h_senders["je.suppose@que.cesont.des.email"];

Ca t'affichera le nombre de fois que l'email "je.suppose@que.cesont.des.email" est trouvé.
J'espère qu'il a trouvé sa solution depuis le temps ^^,
mais en gros l'idée (en perl) c'est d'utiliser les tableau de hash.
il faut entré les valeurs souhaité en tant que clefs et compter le nombre d'occurrence de chaque clef (le nombre de fois où elle apparait dans la liste initiale). En perl un tableau de hash ne peut posséder qu'une seule valeur de clef par tableau (pas de doublon en somme) ce qui règle le problème.

Voilou, je pense que c'est ce qui est proposé dans le dernier poste (ça fait un moment que j'ai pas touché du perl) mais c'est sur cette voie qu'il faut chercher.

cdlt.
Nicolas
Hey!!!!

Vous allez tout de meme pas me dire que mon code est hyper optimisé???? ;-)

Si vous ne connaissez pas PERL, c'est pas grave, écrivez moi dans le langage que vous connaissez le mieux ou en pseudo code voir simplement en français ce que vous feriez pour améliorer mon code (je me chargerai de le transformer en PERL)

J'attend vos suggestions avec impatience mci :)
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 528
Et pourquoi pas placer tes chaînes dans une table de hashage ?
ça permet d'éliminer très facilement les doublons.

(Je ne me rappelle plus de la syntaxe en perl.)
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 528
Pour donner l'exemple en Python, un programme qui prend un fichier A.txt, retire les doublons, trie et écrit le résultat dans B.txt (je vous la joue version compacte):

items = dict( [ (line,0) for line in open('A.txt','rb').read().split('\n')] ).keys()
items.sort()
open('B.txt','w+b').write('\n'.join(items))


C'est pas beau, ça, hum ? Trois petites lines de code ?
(Bon je suis d'accord question lisibilité c'est pas terrible si on connaît pas Python :)