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

effacer répétitions dans une liste [perl] - Perl - Programmation

Marsh Posté le 07-04-2006 à 15:27:25    

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.

Reply

Marsh Posté le 07-04-2006 à 15:27:25   

Reply

Marsh Posté le 07-04-2006 à 15:35:13    

Le mieux c'est de rentrer tes éléments dans un hâchage :
 
Exemple rapide :

#! /usr/bin/perl
 
use strict;
 
my $chaine = "12 33 33 33 77 45 77 24 21";
my %unique = ();
 
$unique{$_} = undef foreach ( split " ", $chaine );
 
$,=" ";
print sort keys %unique, "\n";


Message édité par Elmoricq le 07-04-2006 à 15:37:06
Reply

Marsh Posté le 07-04-2006 à 15:45:35    

Reply

Marsh Posté le 07-04-2006 à 15:51:05    

Ah ouais, j'aime bien leur solution avec grep, j'y pense jamais à cette commande.
J'adore PERL pour ça, y a toujours dix façons de résoudre un même problème. :D
 
En reprenant mon exemple avec la solution qu'ils donnent dans la perldoc, ça donne :
 


#! /usr/bin/perl
 
use strict;
 
my $chaine = "12 33 33 33 77 45 77 24 21";
 
my $prev;
my @sorted = grep {$_ ne $prev and ($prev = $_) } sort split " ", $chaine;
 
$,=" ";
print "@sorted\n";


 
 
EDIT : par contre je connaissais pas cette façon d'initialiser un hash directement avec un tableau de clefs [:pingouino]

Message cité 1 fois
Message édité par Elmoricq le 07-04-2006 à 15:53:01
Reply

Marsh Posté le 07-04-2006 à 16:04:19    

Elmoricq a écrit :

J'adore PERL pour ça, y a toujours dix façons de résoudre un même problème. :D

Citation :

There's more than one way to do it !


---------------
TriScale innov
Reply

Marsh Posté le 07-04-2006 à 16:23:55    

merci les gars !  
je vais essayer ca lundi matin, là c'est le week end pour moi !! :-)
ciao

Reply

Marsh Posté le 07-04-2006 à 16:25:31    

fiftoman a écrit :

merci les gars !  
je vais essayer ca lundi matin, là c'est le week end pour moi !! :-)
ciao


Fonctionnaire ! :o

Reply

Marsh Posté le 07-04-2006 à 16:27:51    

La le code je le trouve quand même un peu "hardcode", la ligne qu'il faut relire 3 fois avant de la comprendre... Et c'est ce que j'aime pas en perl, pour peu que le dev d'avant adore ce genre de chose, on se retrouve vite avec des lignes incompréhensibles...
D'ailleurs tu aurais pu faire pire encore:

Code :
  1. my $chaine = "12 33 33 33 77 45 77 24 21";
  2.    my $prev;
  3.    $,=" ";
  4.    print  grep {$_ ne $prev and ($prev = $_) } sort split " ", $chaine;

Reply

Marsh Posté le 07-04-2006 à 16:37:54    

Ca manque de regexp pour rendre le truc vraiment illisible [:el g]

Reply

Marsh Posté le 07-04-2006 à 22:37:30    

pk pas un petit grep {++$seen{$_}==1} ?

Reply

Marsh Posté le 07-04-2006 à 22:37:30   

Reply

Marsh Posté le 10-04-2006 à 09:42:29    

Elmoricq a écrit :

Fonctionnaire ! :o


 
nan nan pas fonctionnaire, allemand !   :sleep:  
 

Reply

Marsh Posté le 12-04-2006 à 14:47:00    

J'ai une autre question concernant les tris en perl svp:
J'ai ce fichier texte:
#x y
1 5
44 2
3 74
2 11
   
Et en fait, j'aimerais le transformer en un nouveau fichier texte ou les x sont triés par ordre croissant:
 
donc le nouveau fichier texte serait:
 
#x y
1 5
2 11
3 74
44 2
 
Vous savez comment on peut faire ca svp?
merci.
 

Reply

Marsh Posté le 12-04-2006 à 14:56:41    

le plus simple est de lire ton fichier dans une hash_map (clé x ; valeur y) Ensuite, tu tries les clés de ta map et tu affiches.


---------------
TriScale innov
Reply

Marsh Posté le 12-04-2006 à 15:03:36    

ok merci, je vais essayer..

Reply

Marsh Posté le 12-04-2006 à 15:04:01    

t'as juste a adapter un peu le code fourni plus haut ...
T'es en ou pour l'instant, tu as essayé quoi?
 

Spoiler :

feignant...

Reply

Marsh Posté le 12-04-2006 à 15:23:08    

ben en fait, comme je maitrise pas perl, et que je connais pas bien les hashages, j'ai mis chaque ligne de mon fichier dans une liste.
 
MAis le probleme c'est que les elements de la liste sont les lignes entieres et pas juste les x.
 
Sinon j'ai pas compris ce qui avait été fait plus haut. J'avais juste appliqué betement.. Donc pour adapter ..hum hum...
Enfin, merci quand même !  
Miguel

Reply

Marsh Posté le 15-04-2006 à 00:56:19    

Salut,

Code :
  1. #! /usr/bin/perl
  2. use warnings;
  3. use strict;
  4. my %h = ();
  5. my $entete = <DATA>;
  6. while (<DATA> ){
  7.   next unless /^\d/;
  8.   my($cle,$val) = split /\s+/,$_;
  9.   $h{$cle} = $val;
  10. }
  11. print "$entete";
  12. foreach (sort {$a <=> $b} keys %h){
  13.   print "$_ $h{$_}\n";
  14. }
  15. __END__
  16. X Y
  17. 1 6
  18. 3 22
  19. 5 1
  20. 0 8
  21. 10 258
  22. 2 5401

le résultat

Code :
  1. [lamitest@localhost corbeille]$ perl a
  2. X Y
  3. 0 8
  4. 1 6
  5. 2 5401
  6. 3 22
  7. 5 1
  8. 10 258
  9. [lamitest@localhost corbeille]$

lami20j

Reply

Sujets relatifs:

Leave a Replay

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