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

fifto Messages postés 54 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
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.

4 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    je reviens pour expliquer un peu ce que j'ai fait (en plus vu que je n'ai pas envie de dormir...).

    début du script
    #! /usr/bin/perl
    
    use warnings;
    use strict;
    
    my @nbr = qw(12 33 33 33 77 45 77 24 21);
    my %deja_vu;
    
    map{ $deja_vu{$_}++ } @nbr;
    my @unique = sort keys %deja_vu;
    
    
    #affichage
    print "@unique\n"; # donc affichage des éléments du tableau
    print "@{ [ sort keys %deja_vu ] }\n"; # interpolation d’une expression
    
    # $ ou @ peut être interpoler dans une chaîne entre guillemets
    #  le contenu de notre hachage %deja_vu
    
    foreach (sort keys %deja_vu) {
      print "L'élément $_ => $deja_vu{$_} fois\n";
    }
    
    # affichage avec each (pas de tri mais bien plus rapide)
    while ( my($cle,$val) = each %deja_vu ) {
    	print "$cle = > $val fois\n";
    }
    
    
    __END__
    Pourquoi hachage pour résoudre le problème d'unicité?
    Puisque hachage c'est un type de variable Perl qui contient des données
    qui peuvent être appelées par un nom (une clé) qui est unique en comparaison
    avec les éléments d'un tableaux qui sont indexés par un nombre :
    array[0], array[1].....
    
    La clé d'un hachage est unique (comme une clé primaire dans mysql).
    Les clés d'un hash peuveut être récupérées avec keys %hash 
    et le valeurs avec values %hash.
    
    Donc dans un hachage on a un couple clé => valeur
    
    => c'est une virgule magique (son utilisation a 2 raison :
    - l'élément qui est à gauche est traité comme une chaîne
    - pour lisibilité (qui parle d'illisible en Perl?!)
    
    "Perl n'est pas moins lisible que le chinois pour les français.
    Mais ça ne pose pas des problèmes ni pour les Perliens ni pour les Chinois.
    Pour les autres oui." 
    
    En ce cas il nous reste à utiliser un hachage,
    on parcours chaque élément du tableau et pour 
    chaque élément du tableau on incrémente sur 
    la valeur de la clé du hachage.
    
    Donc pour chaque élément du tableau on incrémente.
    Si l'élément du tableau n'est pas unique (vu que la clé d'un hash en est......)
    
    $hash{'12'}++ # pour l'instant vaut 1 et la valeur restera 1 (donc une fois) si 12 est unique
    $hash{'33'}++ # pareil
    $hash{'33'}++ # vaut 2
    $hash{'33'}++ # vaut 3
    etc.....
    
    J'ai rajouté dans le code (avant __END__)  pour voir le résultat.
    
    En final on aura les clés du hash qui sont en fait les éléments uniques de notre liste
    et les valeurs qui représente combien on a de chaque.
    
    foreach (sort keys %hash) {
      print "$_ => $hash{$_}\n";
    }
    
    Si on n'a pas besoin de trier le hachage mieux vaut utiliser "each"
    
    while ( my($cle,$val) = each %hash ) {
    	print "$cle = > $val fois\n";
    }
    ______________________________________
    Tout ce qui est écrit après END n'est pas traité
    par l'interpréteur Perl (mais  peut être lu par
    le handle de fichier DATA)
    
    Ex :
    
    while(<DATA>) {
    	print; # affichage des lignes contenu après END
    }
    
    fin du script
    1
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    si on ne pense pas en hachage alors on ne pense pas en perl.

    #! /usr/bin/perl
    
    use warnings;
    use strict;
    
    my @nbr = qw(12 33 33 33 77 45 77 24 21);
    my %deja_vu;
    
    foreach (@nbr) {
       $deja_vu{$_}++;
    }
    
    print sort keys %deja_vu;

    ou

    #! /usr/bin/perl
    
    use warnings;
    use strict;
    
    my @nbr = qw(12 33 33 33 77 45 77 24 21);
    my %deja_vu;
    
    map{ $deja_vu{$_}++ } @nbr;
    
    print sort keys %deja_vu;
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    pour un meilleur affichage
    #! /usr/bin/perl
    
    use warnings;
    use strict;
    
    my @nbr = qw(12 33 33 33 77 45 77 24 21);
    my %deja_vu;
    
    map{ $deja_vu{$_}++ } @nbr;
    print "@{ [ sort keys %deja_vu ] }\n";
    Si tu veux stocker les valeurs pour une utilisation ultérieure
    #! /usr/bin/perl
    
    use warnings;
    use strict;
    
    my @nbr = qw(12 33 33 33 77 45 77 24 21);
    my %deja_vu;
    
    map{ $deja_vu{$_}++ } @nbr;
    my @unique = sort keys %deja_vu;
    print "@unique\n";
    0
  4. Artis
     
    Topic qui date un peu, mais qui m'a aidé.
    Donc je laisse un mot pour remercier Lami20j qui m'a bien aidé avec ses explications que n'importe qui, même completement noob, comprendrait.
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      avec plaisir ;-)
      0