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 :

Rechercher les element d'une liste dans une autre liste


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Par défaut Rechercher les element d'une liste dans une autre liste
    Bonjour je débute en perl et j'aurais besoin de quelques conseils.

    Je souhaite comparer deux listes et conserver les elements de ma premiere liste a condition qu'ils soient présents dans la deuxieme.

    tout d'abord la forme du document que je dois traiter est la suivante
    mot : synonyme1, synonyme2, ...

    j'ai donc une premiere liste qui est composée de ma liste des synonymes
    je l'obtient en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ($mot, $syn)=spit( / : / , $_ );
    après je met en place mes boucles

    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
     
    open(DICO, $dico);
    while (<DICO>)
    foreach $VAR ($syn)
    {
         foreach $VAR1 ($liste2)
            {
            if($VAR1 eq $VAR)
             {
                push(@result, $VAR);
             }
       }
    }
     
    close (dico)
    Comme vous pouvez vous en doutez ca ne fonctionne pas aussi je ne vous demanderai pas de l'aide.

    J'ai fait quelquie test est je remarque que $VAR ne me renvoie pas la premiere valeur de ma liste mais la liste complete
    Alors que moi je souhaite tout d'abord regarder s'il la premiere valeur de ma liste syn appartient à la liste2 si c'est le cas j'ajoute a ma liste résultat sinon je passe au deuxieme element de ma liste syn.

    Je susi a l'écoute de tous les conseils et je pense qu'une optimisation sera possible en utilisant la fonction grepau lieu de la seconde boucle foreach mais on verra ca apres

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Hello,

    déjà y a un truc qui cloche (j'ai pas regardé plus en détail) mais la fonction pour spliter les données s'appelle split et non spit


  3. #3
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut Re: Rechercher les element d'une liste dans une autre liste
    Bonjour,

    Citation Envoyé par fessebleu
    Je souhaite comparer deux listes et conserver les elements de ma premiere liste a condition qu'ils soient présents dans la deuxieme.

    tout d'abord la forme du document que je dois traiter est la suivante
    mot : synonyme1, synonyme2, ...

    j'ai donc une premiere liste qui est composée de ma liste des synonymes
    je l'obtient en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ($mot, $syn)=split( / : / , $_ );
    En faisant ainsi (à la correction de typo sur le split près), tu n'obtiens qu'une liste de deux éléments : $mot et $syn ... s'il y avait plus d'une fois " : " dans $_, tous les champs suivants sont négligés ... est-ce l'effet souhaité ?

    Citation Envoyé par fessebleu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    open(DICO, $dico);
    while (<DICO>)
    foreach $VAR ($syn)
    {
         foreach $VAR1 ($liste2)
            {
            if($VAR1 eq $VAR)
             {
                push(@result, $VAR);
             }
       }
    }
     
    close (dico)
    euh ... $syn est un scalaire, pas une liste ... c'est donc un élément "unique". Un foreach sur un scalaire correspond au parcours d'une liste d'un seul élément.

    Même remarque pour $liste2 dans le deuxième foreach !

    De plus, dans ce que tu fournis comme exemple, tu ne te préoccupe jamais de ce qui est récupéré dans <DICO>

    Citation Envoyé par fessebleu
    J'ai fait quelquie test est je remarque que $VAR ne me renvoie pas la premiere valeur de ma liste mais la liste complete
    Alors que moi je souhaite tout d'abord regarder s'il la premiere valeur de ma liste syn appartient à la liste2 si c'est le cas j'ajoute a ma liste résultat sinon je passe au deuxieme element de ma liste syn.
    Es tu sûr de ton séparateur de champs, dans le split ? Il s'agit bien d'un ":" encadré d'un blanc de chaque côté ???

    Il te faut faire un peu plus attention au "type" des données que tu manipules. Une valeur isolée se range dans un "scalaire" (préfixé par un $) alors qu'une liste ou tableau (préfixé par un @) en contient plusieurs.

    Dans le cas qui t'intéresse, l'usage d'une table hachée (préfixée par un %) peut être d'un grand secours. En effet, dans un hash, les valeurs sont indexées par une chaine de caractère, ce qui facilite grandement les recherches et est très pratique pour constituer toutes sortes de "dictionnaires".

    Je t'invite à consulter, éventuellement, les articles à ce sujet dans la FAQ (lien dans ma signature, rubriques 3.2, 3.3 et 3.4) en espérant que tu y trouveras de quoi choisir les meilleures structures de données pour les traitements que tu souhaites réaliser.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Par défaut
    Bonjour à tous
    Tout d'abord je m'excuse de répondre si tard mais malheureusement j'ai du mettre de coté ce projet

    Merci à 2Eurocents pour tes conseils et en lisant les faq j'ai changer de méthodes

    mon fichier de départ est de la forme suivante :

    se conformer:observer,respecter,suivre,tenir
    se maintenir:pers��er,tenir
    soutenir:continuer,d�endre,maintenir,pers��er,suivre,supporter,tenir
    suivre:accomplir,continuer,observer,respecter,se conformer,soutenir,tenir
    supporter:maintenir,soutenir,tenir
    tenir:accomplir,arr�er,conserver,continuer,d�endre,ex�uter,faire,garder,maintenir,manier,observer,occuper,pers��er,respecter,retenir,satisfaire,se conformer,se maintenir,soutenir,suivre,supporter

    Pour obtenir un minidictionnaire, je définie une vedette principale. je regarde les synonymes de ma vedette . Puis je dois les comparer avec les autres synonymes des autres vedettes.

    Si "tenir" est ma vedette principale , je dois comparer ses synonymes avec ceux des autres vedettes (dans l'exemple de dico audessus, je dois donc comparer avec satisfaire, se conformer, se maintenir, ..., supporter)
    Je ne conserve que les synonymes qui sont identiques à ceux de tenir. J'obtiens donc un nouveau dico appelé minidico.
    J'ai donc utilisé les tables de hachage (s'il quelqu'un a une autres solutions je suis preneur), mais un petitprobleme apparait
    des synonymes apparaissent en double

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     #!/usr/bin/perl
     $dicopath=".";
     $dico="$dicopath/";
     $dico.="$ARGV[0]";
     $vedetteprincipalepath=".";
     $vedetteprincipale.="$ARGV[1]";
     $syn=$ARGV[2];
     
     print ("$vedetteprincipale\n");
     #ouverture du dictionnaire
     open(DICO, $dico);
     #on récupére la liste des synonyme de la vedette principale que l'on met dans un tableau
     #@synvedetteprinci=();
     while (<DICO>)
     {
         ($vedette,$synons)=split(/:/,$_);
         if(($vedette) eq ($vedetteprincipale))
         {
         @synvedetteprinci =  split(/,/,$synons);
         }
     }
     print("je lis le fichier "); 
     print "$dico";
     print("========================================================================================\n");
     close(DICO);
     
     #on compare les synomnyme de chaque vedette avec le résultat des synonyme de la vedette principal
     #S'il le synonyme apparait dana la liste on le conserve sinon on continue
     #on construit ainsi le nouveau minidico
     open(DICO, $dico);
     while (<DICO>)
     {
     #création de la table de hachage
        ($vedette,$syno)=split(/:/,$_);
         %tmp_vs=($vedette,$syno);
         %ved_syn=(%ved_syn,%tmp_vs);
     } 
      while (($local_ved,$local_syno) = each %ved_syn)
     {
         @local_syno2=split(/,/,$local_syno);
         print("%s \n Vedette : $local_ved \n Synonymes: \n");
         foreach $synotmp (@local_syno2){
         foreach $synvedette (@synvedetteprinci){
            if($synvedette =~ $synotmp){
                      #on regarde s'il le synonyme "synotmp" appartient au  synonyme de ma vedette principale 
                print (" \t $synotmp \n");
            }
            }
         }
     }
     close(DICO);
     
     #on enregistre le résultat dfans le fichier
     open(SYN,">$syn");
     print(SYN @synreduit);
     close(SYN);
    voici un copier coller de mon résultat

    tenir
    je lis le fichier ./minidico2_tenir.txt========================================================================================
    %s
    Vedette : se maintenir
    Synonymes:
    pers��er
    %s
    Vedette : satisfaire
    Synonymes:
    accomplir
    ex�uter
    faire
    faire
    observer
    respecter
    %s
    Vedette : soutenir
    Synonymes:
    continuer
    d�endre
    maintenir
    maintenir
    pers��er
    suivre
    supporter
    %s
    Vedette : supporter
    Synonymes:
    maintenir
    maintenir //NE DEVREZ PAS REAPPAITRE UNE DEUXIEME FOIS
    soutenir
    %s
    Vedette :

    Synonymes:
    %s
    Vedette : suivre
    Synonymes:
    accomplir
    continuer
    observer
    respecter
    se conformer
    soutenir
    %s
    Vedette : se conformer
    Synonymes:
    observer
    respecter
    suivre
    %s
    Vedette : tenir
    Synonymes:
    accomplir
    arr�er
    conserver
    continuer
    d�endre
    ex�uter
    faire
    faire
    garder
    maintenir
    maintenir
    manier
    observer
    occuper
    pers��er
    respecter
    retenir
    satisfaire
    se conformer
    se maintenir
    soutenir
    suivre
    supporter

    J'ai un autre petit souci qui est pour la reconstruction de mon fichier. Au départ, je voulais réutilisais les table de hachage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        foreach $synvedette (@synvedetteprinci){
            if($synvedette =~ $synotmp){
                      #on regarde s'il le synonyme "synotmp" appartient au  synonyme de ma vedette principale 
                print (" \t $synotmp \n");
            }
    A ce moment la, je voulais recré une table de hachage pour y mettre le synonyme est conserver la vedette. En faisant les essais j'ai remarqué que puisque la clés ne change pas, la valeur insérer écrasait l'ancienne. Mais moi je souhaite les conserver. Est ce qu'il existe un moyen de d'obtenir avec une table de hachage plusieur valeur pour une seule clé

    Merci d'avance pour vos conseil
    Amicalement Fessebleu

  5. #5
    Membre Expert
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Par défaut
    Est ce qu'il existe un moyen de d'obtenir avec une table de hachage plusieur valeur pour une seule clé
    Et bien oui et non
    Une clé de table de hachage ne peut être associé qu'à une seule valeur, mais cette valeur peut en représenter plusieurs. Cela se fait avec les références : si l'u des éléments de ta table de hachage est une référence, tu peux faire en sorte que cette référence soit une référence vers un tableau ou un autre table de hachage, dans ce cas elle représentera plusieurs valeurs au choix. Un exemple sera plus parlant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $ref = {"cle1" => "ele1",
                "cle2" => "ele2"};
     
    my %h = ("cle3" => "ele3",
            "cle4" => $ref);
     
    print $h{cle4}->{cle1}; #affiche ele1
    Cela te convient-il ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Par défaut
    je vais regarder de plus pres ce que tu viens d'écrire.
    Mais pour l'instant j'ai contourné le probleme avec des listes
    mais merci de ta réponse

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Salut,

    Personnellement je pense qu'il y a toujours des confusions concernant la terminologie.

    Dans le livre de Larry Wall, Programmation en Perl, il parle de Hachage de tableaux, Tableaux des hachage, Tableaux de tableaux et Hachages de hachages.

    Table de hachage????

    Donc dans ton cas je crois que tu parles d'un Hachage de tableaux.
    Donc une cle à comme valeur une référence à un tableau anonyme.

    Voilà une répresentation
    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
    #! /usr/bin/perl 
     
    use warnings; 
    use strict; 
     
    # Hachage de tableaux 
    my %HdT = ( 
           cle1 => [ "a", "b", "c" ], 
           cle2 => [ "aa", "bb", "cc" ], 
           cle3 => [ "aaa", "bbb", "ccc"], 
    ); 
    # Manipulation des Hachages de tableaux 
     
    foreach (sort keys %HdT) { 
     print "$_ => @{$HdT{$_}}\n"; 
    } 
    print "\n"; 
    # Ajoute de la cle4 avec ses éléments 
    push @{$HdT{cle4}}, 1..4; 
     
    # affichage
    foreach my $cle ( sort keys %HdT) { 
     print "$cle : "; 
       foreach my $i (0..$#{$HdT{$cle}}){ 
         print " t[$i] = $HdT{$cle}[$i] "; 
       } 
     print "\n"; 
    }
    Ca ne me dérange pas la terminologie, mais on commence à parer de hachage de tableaux et on fini avec table de hachage.

    A toi de voir.

    lami20j

    P.S. Il faut lire et comprendre les références.

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Bizarre,

    j'ai modifé mon message et je l'ai eu en double. Désolé.
    Peut être une mauvaise manip de ma part.

    lami20j

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Salut,

    Personnellement je pense qu'il y a toujours des confusions concernant la terminologie.

    Dans le livre de Larry Wall, Programmation en Perl, il parle de Hachage de tableaux, Tableaux des hachage, Tableaux de tableaux et Hachages de hachages.

    Table de hachage????

    Donc dans ton cas je crois que tu parles d'un Hachage de tableaux.
    Donc une cle à comme valeur une référence à un tableau anonyme.
    Donc plusieurs valeurs pour une seule clé.

    Voilà une répresentation
    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
    #! /usr/bin/perl 
     
    use warnings; 
    use strict; 
     
    # Hachage de tableaux 
    my %HdT = ( 
           cle1 => [ "a", "b", "c" ], 
           cle2 => [ "aa", "bb", "cc" ], 
           cle3 => [ "aaa", "bbb", "ccc"], 
    ); 
    # Manipulation des Hachages de tableaux 
     
    foreach (sort keys %HdT) { 
     print "$_ => @{$HdT{$_}}\n"; 
    } 
    print "\n"; 
    # Ajoute de la cle4 avec ses éléments 
    push @{$HdT{cle4}}, 1..4; 
     
    # affichage
    foreach my $cle ( sort keys %HdT) { 
     print "$cle : "; 
       foreach my $i (0..$#{$HdT{$cle}}){ 
         print " t[$i] = $HdT{$cle}[$i] "; 
       } 
     print "\n"; 
    }
    Ca ne me dérange pas la terminologie, mais on commence à parer de hachage de tableaux et on fini avec table de hachage.

    A toi de voir.

    lami20j

    P.S. Il faut lire et comprendre les références.

Discussions similaires

  1. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 17h37
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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