Suppression de doublons - PERL

Fermé
bibi - 6 févr. 2003 à 11:49
 bheadman - 21 sept. 2009 à 14:26
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 ;)
A voir également:

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
Bobinours Messages postés 2898 Date d'inscription jeudi 26 avril 2001 Statut Membre Dernière intervention 21 mars 2013 504
7 févr. 2003 à 18:46
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é.
1
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
1
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 :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
7 févr. 2003 à 13:04
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.)
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
7 févr. 2003 à 15:30
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 :)
0