IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Différences entre 2 listes


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    7
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7
    Par défaut Différences entre 2 listes
    Bonjour,

    Je veux faire quelque chose qui parait simple mais je m'arrache un peu les cheuveux, je pense qu'il y a moyen de le faire assez simplement avec un hash mais je n'y arrive pas.

    J'ai une liste @reference qui contient les références, et une liste @match contenant plusieurs nombres (avec des doublons).

    J'aimerai juste obtenir une liste des références qui ne sont pas trouvés dans @match

    @ref = (1..10);
    @match(1,2,4,5,8,9,10);

    ce que j'aimerai trouver :
    @diff = (3,6,7);

    Il me semble l'avoir déjà vu quelque chose comme ça sur le forum mais je n'ai pas réussi à retrouver :'(

    Quelqu'un connait-il la solution SVP ?

    Merci

  2. #2
    Membre averti Avatar de philouelgeek
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 60
    Par défaut
    Je te conseillerai de passer par un hash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #!/usr/local/bin/perl -w
     
    ## MODULES
    use strict;
    use warnings;
     
    ## VARIABLES
        # Scalaires
        my $element;
     
        # Tableaux
        my @union =  ();
        my @intersection =  ();
        my @difference = ();
     
        my @array1 =  (1..10);
        my @array2 =  (1,2,4,5,8,9,10);
     
        # Hash
        my %count = ();
     
     
    ## PROGRAMME PRINCIPAL
     
        foreach $element (@array1, @array2) { $count{$element}++ }
        foreach $element (keys %count) {
            push @union, $element;
            push @{ $count{$element} > 1 ? \@intersection : \@difference }, $element;
        }
     
        foreach my $tmp1 (@difference)
        {
            print $tmp1."\n";
        }
    Les différences entre tes deux listes se trouvent dans @difference

    @++

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Il existe des modules qui font ce que tu veux rapidement, proprement et facilement. Pas besoin de réinventer la roue.
    Regarde le module List::Compare

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    use List::Compare;
     
    my @ref = (1..10);
    my @match = (1,2,4,5,8,9,10);
    my $lc = List::Compare->new(\@ref, \@match);
     
    my @Lonly = $lc->get_unique;
    print "Ton resultat : @Lonly\n";
    Ton resultat : 3 6 7

  4. #4
    Membre régulier
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    7
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7
    Par défaut
    Merci beaucoup à vous, c'est bien ça que je voulais

    Je préfère éviter d'utiliser les modules car je ne sais pas où vas être lancé mon script par la suite.

  5. #5
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Si tu le fais à la main, va au plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my @ref = 1..10;
    my @match = (1,2,4,5,8,9,10);
     
    my %match = map { $_ => 1} @match;
    my @filtered = grep { ! $match{$_} } @ref;

  6. #6
    Membre averti Avatar de philouelgeek
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 60
    Par défaut
    Peut-être que mettre ce petit bout de code dans la faq pourrait être sympa vu qu'il est indenté sans module et donc une alternative au CPAN

    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Quelle différence entre une liste et une bibliothèque ?
    Par Casmer dans le forum SharePoint
    Réponses: 4
    Dernier message: 19/01/2015, 17h02
  2. Réponses: 1
    Dernier message: 22/03/2011, 11h07
  3. Différences entre deux listes
    Par Jean-Matt dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2009, 11h59
  4. [Performance] Différence entre List<T> et Collection<T>
    Par simone.51 dans le forum Framework .NET
    Réponses: 3
    Dernier message: 14/04/2008, 12h19
  5. la différence entre élement liste et une lov
    Par rara_rara dans le forum Oracle
    Réponses: 2
    Dernier message: 04/10/2006, 10h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo