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 :

Fusionner les branches d'un arbre (hash de hash de ....)


Sujet :

Langage Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 376
    Points : 402
    Points
    402
    Par défaut Fusionner les branches d'un arbre (hash de hash de ....)
    Bonjour,

    Je débute en PERL mais la je n'ai pas trop le choix de la techno ... En fait j'ai un arbre à N niveaux (exemple) :
    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
     
    F1 => {
        TOTO => {
            aa => 1,
            bb => 1,
            cc => 1
        }
        TATA => {
            aa => 1,
            bb => 1
        }
    }
    F2 => {
        TOTO => {
            aa => 1,
            bb => 1,
            cc => 1
        }
        TATA => {
            aa => 1,
            bb => 1
        }
    }
    Et en sortie il faut que je fusionne mes branches du niveau le plus haut pour obtenir quelques chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    TOTO => {
        aa => 2,
        bb => 2,
        cc => 2
    }
    TATA => {
        aa => 2,
        bb => 2
    }
    Et la je bloque complétement ... je sais qu'il faut faire une fonction récursive qui va me parcourir le tout mais pour le reste ... :'(
    Si qq1 à une idée.

    m'ci !
    "There are two major products that come out of Berkeley: LSD and UNIX.
    We don't believe this to be a coincidence."
    - Jeremy S. Anderson

    La FAQ Python
    Les cours et tutoriels pour apprendre Python
    Le Forum Python

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 376
    Points : 402
    Points
    402
    Par défaut
    Personne ????
    C'est une vrai torture mental ce truc ... :'(
    "There are two major products that come out of Berkeley: LSD and UNIX.
    We don't believe this to be a coincidence."
    - Jeremy S. Anderson

    La FAQ Python
    Les cours et tutoriels pour apprendre Python
    Le Forum Python

  3. #3
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    ben, pour deux niveaux comme présenté, c'est trivial, quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my %fusion;
     
    for my $x( keys %h ) {
        for my $y( keys %{$h{$x}} ) {
            for my $z( keys %{$h{$x}{$y}} ) {
                $fusion{$y}{$z} += $h{$x}{$y}{$z};
            }
        }
    }
    devrait faire l'affaire. Mais je ne suis pas trop sur de ce que tu veux faire. En gros tu veux écraser le premier niveau de clefs, et faire la somme des valeurs des clefs identiques, et le nombre de hashes peuvent être imbriqués à un niveau arbitrairement profond, c'est ça ?

    N

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 376
    Points : 402
    Points
    402
    Par défaut
    Citation Envoyé par nematoad
    En gros tu veux écraser le premier niveau de clefs, et faire la somme des valeurs des clefs identiques, et le nombre de hashes peuvent être imbriqués à un niveau arbitrairement profond, c'est ça ?

    N
    C'est exactement ça !!! J'en ai chopé des mals de crane :'(
    Pour le moment j'ai fait totalement autre chose pour mon traitement, mais si qq1 à une soluce, ca m'arrange, j'ai pas à repasser sur mon fichier.

    ++
    "There are two major products that come out of Berkeley: LSD and UNIX.
    We don't believe this to be a coincidence."
    - Jeremy S. Anderson

    La FAQ Python
    Les cours et tutoriels pour apprendre Python
    Le Forum Python

  5. #5
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    Bon, j'ai utilisé Storable pour me cloner les parties de l'arbre qui n'ont jamais été visité, sinon le code est beaucoup plus complexe pour peu de gain en lisibilité. Je crois que ceci fait ce que tu demandes:

    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
     
    my $r = {
        F1 => # ta definition du hash de la mort
        F2 => ...,
    };
     
    use Storable 'dclone';
     
    for my $f (keys %$r) {
        # F1, F2..
        my $branche = $r->{$f};
        for my $t( keys %$branche ) {
            if( not exists $new->{$t} ) {
                $new->{$t} = dclone( $branche->{$t} );
            }
            else {
                fusion( $new->{$t}, $branche->{$t} );
            }
        }
    }
     
    sub fusion {
        my $maitre = shift;
        my $enfant = shift;
        for my $k( keys %$enfant ) {
            if( ref($enfant->{$k}) eq 'HASH' ) {
                fusion( $maitre->{$k}, $enfant->{$k} );
            }
            else {
                $maitre->{$k} += $enfant->{$k};
            }
        }
    }
    Dis moi si c'est bon

    N

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 376
    Points : 402
    Points
    402
    Par défaut
    Salut !

    Pour commencer MERCI BEAUCOUP !
    En fait, ça ne marche pas tout a fait ... j'ai des clefs qui ont disparue, mais le principe semble bon. Je vais partir de ça, ça va déjà bien m'aider !!!!
    Bon la je suis passé sur autre chose ... (pffff ces responsable :p ), mais dès que je m'y remet, jle débug. je te tiens au courant.

    ++
    "There are two major products that come out of Berkeley: LSD and UNIX.
    We don't believe this to be a coincidence."
    - Jeremy S. Anderson

    La FAQ Python
    Les cours et tutoriels pour apprendre Python
    Le Forum Python

  7. #7
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    Citation Envoyé par getupa
    j'ai des clefs qui ont disparue, mais le principe semble bon.
    Effectivement, j'ai pensé au cas suivant (que le code ne gére pas):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    my $r = {
        F1 => {
            aa => 1,
        },
        F2 => {
            aa => {
                bb => 1,
                cc => 1,
            },
        },
    }
    Dans la première branche, aa pointe sur un scalar, mais dans le deuxième il pointe sur une référence, donc il va y avoir un peu de grabuge.

    N

Discussions similaires

  1. fusionner les donéées de deux entrées
    Par melodynelson dans le forum Access
    Réponses: 5
    Dernier message: 18/11/2005, 13h41
  2. Parcours d'un hash de hash de hash
    Par ngere dans le forum Langage
    Réponses: 5
    Dernier message: 06/07/2005, 09h53
  3. [JTree] Evenements sur branche de l'arbre
    Par Micky1407 dans le forum Composants
    Réponses: 2
    Dernier message: 31/05/2005, 09h17
  4. Réponses: 19
    Dernier message: 03/08/2004, 10h26

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