comment comparer deux listes?? [autre question...]

comment comparer deux listes?? [autre question...] - Perl - Programmation

Marsh Posté le 07-04-2005 à 09:09:57    

Bonjour, je débute en perl et je suis en train de faire un script où à un moment, je dois comparer deux listes d'éléments. Les éléments du tableau, étant des noms de gènes..ex : CX038409,BX886823,BX076624,CX033076....
les tableaux contient entre 8 et 30 éléments et c'est complètement variable.
je dois essayer de coder qqchose pour comparer deux listes et voir si elles ont au moins 8 éléments en commun.
J'espère que j'ai été a peu près clair....  :pt1cable:  
Donc en fait, j'aimerai savoir s'il existe une fonction qui peut comparer deux listes...j'y crois pas trop ou si vous aviez une idée pour faire qqchose le plus léger possible?
merci beaucoup de votre aide  :jap:


Message édité par babarpapa le 08-04-2005 à 13:53:43

---------------
http://festivaldujeu-montpellier.org/
Reply

Marsh Posté le 07-04-2005 à 09:09:57   

Reply

Marsh Posté le 07-04-2005 à 10:18:56    

des que tu veux faire des comparaisons, ou simplement etre certain que les elements de ton tableau son uniques (pas deux elements identiques) tu a interet à utiliser des tables de hash plutot que des listes.
Donc ici le plus simple est de mtransformer tes deux listes en hash et de les merger en un seul hash. si le nombre de cle est inferieur à la somme des deux tableaux alors il y a des elements communs entre les deux listes (attention ca ne marche pas si tes listes comportent deja des doublons, dans ce cas il faut les passer en hash avant de compter leurs clés respectives)
 

Code :
  1. my %hash = map{$_ => 1} (@tab1, @tab2);
  2. my @tab = keys %hash;
  3. my $nombre_elements_commun = @tab1 + @tab2 - @tab;


Message édité par pospos le 07-04-2005 à 11:04:59
Reply

Marsh Posté le 07-04-2005 à 10:57:29    

merci beaucoup pour ta réponse!
je vais étudier ta solution qui a l'air super bien. Mais liste ne peuvent pas contenir de doublons, mais par contre, il é tres probable quelles ne fassent pas la meme taile, pas grave?


---------------
http://festivaldujeu-montpellier.org/
Reply

Marsh Posté le 07-04-2005 à 11:03:58    

non pas grave
la ca va te permettre de connaitre le nombre d'elements communs
 
si tu veux connaitre quels elements sont communs il faut proceder un peu autrement
 
PS: j'avais inversé le signe de $nombre_elements_commun dans l'exemple


Message édité par pospos le 07-04-2005 à 11:05:56
Reply

Marsh Posté le 07-04-2005 à 11:08:10    

ok, merci pour ton aide précieuse ;)


---------------
http://festivaldujeu-montpellier.org/
Reply

Marsh Posté le 07-04-2005 à 11:31:01    

ça marche nickel!!
merci encore! ;)


---------------
http://festivaldujeu-montpellier.org/
Reply

Marsh Posté le 08-04-2005 à 13:44:06    

autre petit question, est ce que tu crois qu'il y aurait moyen de récupérer les éléments qui était commun au deux tableau dans un autre tableau?  
merci

Reply

Marsh Posté le 08-04-2005 à 16:18:28    

Code :
  1. my %seen;
  2. my @commun = grep {$seen{$_}++} @tab1, @tab2;


encore une fois ca ne marche que si tu est certain que tes listes ne contiennent pas de doublon.

Reply

Marsh Posté le 08-04-2005 à 16:22:13    

et evidemment ca te donne egalement la reponse à ta premiere question (de maniere plus simple et plus rapide en plus):
 
my $nombre_elements_commun = @commun;

Reply

Marsh Posté le 08-04-2005 à 16:44:58    

ouf! c'est trop puissant pour moi! lol
c'est niquel, il n'y a pa de doublon, c'est sur.
encore une fois, je te remercie bcp! :)


---------------
http://festivaldujeu-montpellier.org/
Reply

Marsh Posté le 08-04-2005 à 16:44:58   

Reply

Marsh Posté le 11-04-2005 à 09:52:36    

recu en pm:

babarpapa a écrit :

j'ai une petite question sur les 2 lignes de codes que tu m'a donné stp.
quand tu mets my @commun = grep {$seen{$_}++} @tab1, @tab2;
je comprends pas très bien comment marche le $seen{$_}++?
peux tu m'expliquer très rapidement stp?
je te remercie


 
alors, l'instruction grep sert à filtrer le (ou les) tableau donné en parmatetre en ne conservant que les elements qui retourne "vrai" dans le test entre accolades. chaque element est passé dans la variable $_. Ici on utilise une table de hash %seen (qui faut reinitialiser à chaque fois) qui permet de savoir quels element du tableau sont deja passé dans le filtre: à chaque fois qu'on vois passer un element on increment sa valeur dans le tableau. la post incrementation ($val++) a la particularité de retourner la valeur de la variable AVANT incrementation, donc si $seen{blabla} valais 0 avant son passage dans le filtre (c'est à dire si on avait pas encore vu passer 'blabla'), alors le test retrourne 0 et "blabla" est donc filtre. mais maintenant $seen{blabla} vaut 1. la fois suivant ou l'on verra "blabla" $seen{blabla} vaudra 1 (tout comme $seen{blabla}++) et "blabla" sera donc conservé.

Reply

Marsh Posté le 11-04-2005 à 09:56:39    

explication très clair. maintenant, j'ai tout à fait compris!  
encore une fois merci pour ton aide et ta rapidité ;)

Reply

Marsh Posté le 11-04-2005 à 17:08:22    

Ingenieuse ta solution pospos, jolie utilisation de grep.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed