Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1118 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1341527
fiftoman
Posté le 07-04-2006 à 15:27:25  profilanswer
 

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.

mood
Publicité
Posté le 07-04-2006 à 15:27:25  profilanswer
 

n°1341540
Elmoricq
Modérateur
Posté le 07-04-2006 à 15:35:13  profilanswer
 

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
n°1341553
anapajari
s/travail/glanding on hfr/gs;
Posté le 07-04-2006 à 15:45:35  profilanswer
 
n°1341563
Elmoricq
Modérateur
Posté le 07-04-2006 à 15:51:05  profilanswer
 

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
n°1341574
franceso
Posté le 07-04-2006 à 16:04:19  profilanswer
 

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
n°1341602
fiftoman
Posté le 07-04-2006 à 16:23:55  profilanswer
 

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

n°1341606
Elmoricq
Modérateur
Posté le 07-04-2006 à 16:25:31  profilanswer
 

fiftoman a écrit :

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


Fonctionnaire ! :o

n°1341611
anapajari
s/travail/glanding on hfr/gs;
Posté le 07-04-2006 à 16:27:51  profilanswer
 

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;

n°1341629
Elmoricq
Modérateur
Posté le 07-04-2006 à 16:37:54  profilanswer
 

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

n°1341819
pospos
Posté le 07-04-2006 à 22:37:30  profilanswer
 

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

mood
Publicité
Posté le 07-04-2006 à 22:37:30  profilanswer
 

n°1342732
fiftoman
Posté le 10-04-2006 à 09:42:29  profilanswer
 

Elmoricq a écrit :

Fonctionnaire ! :o


 
nan nan pas fonctionnaire, allemand !   :sleep:  
 

n°1345011
fiftoman
Posté le 12-04-2006 à 14:47:00  profilanswer
 

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.
 

n°1345022
franceso
Posté le 12-04-2006 à 14:56:41  profilanswer
 

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
n°1345035
fiftoman
Posté le 12-04-2006 à 15:03:36  profilanswer
 

ok merci, je vais essayer..

n°1345037
anapajari
s/travail/glanding on hfr/gs;
Posté le 12-04-2006 à 15:04:01  profilanswer
 

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...

n°1345083
fiftoman
Posté le 12-04-2006 à 15:23:08  profilanswer
 

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

n°1347307
lami20j
Posté le 15-04-2006 à 00:56:19  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

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

 

Sujets relatifs
Liste videliste deroulante
[Perl] question relativement facile.Question de débutant. Interface HTML pour mes scripts perl ???
Selectionner valeur dans une liste déroulante[Perl]Code de 8 lignes à essayer sous Perl sous Linux
[Résolu[VBA][Access] Remplissage d'1 liste déroulante avec 1 Recordsetliste deroulante
[Perl] effacer début fichier texte 
Plus de sujets relatifs à : [perl]effacer répétitions dans une liste


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR