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 :

Tri par valeur d un hash de hash


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Tri par valeur d un hash de hash
    Bonjour.. (enfin rebonjour pour ceux qui ont lu le message precedent )

    Je cherche a trier par valeur un hash de hash.
    Pour l instant j ai trouve qu une solution intermediaire ou j utilise qu a moitie la possibilite de tirer de perl

    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
     
    foreach $i_clust1 (keys %interClusterScore)
    			{
    				my $bestIClust2 = -1;
    				#find the best score for i_clust1
    				foreach $i_clust2 (sort { $interClusterScore{$i_clust1}{$b} <=> $interClusterScore{$i_clust1}{$a} } keys %{$interClusterScore{$i_clust1}})
    				{
    					$bestIClust2 = $i_clust2;
    					last;
    				}
    				my $scoreClusts = $interClusterScore{$i_clust1}{$bestIClust2};
     
    				if ($scoreClusts > $maxSum)
    				{
    					$indexClust1 = $i_clust1;
    					$indexClust2 = $bestIClust2;
    					$maxSum = $scoreClusts;
    				}
    			}
    Quelqu un aurait une meilleure idee?

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut Re: Tri par valeur d un hash de hash
    Bonjour,

    Citation Envoyé par LeLaulau
    Je cherche a trier par valeur un hash de hash.
    Avant d'aller plus loin, j'aimerai savoir ce que tu veux dire par là ...

    On peut trier les clefs d'un hash, en fonction de leur valeur où des valeurs hachées, mais pour un hash de hash, il faut un peu plus d'explications ...

    Veux-tu trier les clefs du hash externe par valeur maximale des valeurs hachées dans les hashs internes ? Ou bien toute autre combinaison ?

    Citation Envoyé par LeLaulau
    Pour l instant j ai trouve qu une solution intermediaire ou j utilise qu a moitie la possibilite de tirer de perl

    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
     
    foreach $i_clust1 (keys %interClusterScore)
    			{
    				my $bestIClust2 = -1;
    				#find the best score for i_clust1
    				foreach $i_clust2 (sort { $interClusterScore{$i_clust1}{$b} <=> $interClusterScore{$i_clust1}{$a} } keys %{$interClusterScore{$i_clust1}})
    				{
    					$bestIClust2 = $i_clust2;
    					last;
    				}
    				my $scoreClusts = $interClusterScore{$i_clust1}{$bestIClust2};
     
    				if ($scoreClusts > $maxSum)
    				{
    					$indexClust1 = $i_clust1;
    					$indexClust2 = $bestIClust2;
    					$maxSum = $scoreClusts;
    				}
    			}
    Quelqu un aurait une meilleure idee?
    Pour l'instant, pas de meilleure idée, mais quelques questions ...

    Pourquoi faire un foreach $i_clust2 ... si c'est pour sauter directement à la dernière itération lors de la première ?

    As tu fait usage des pragma strict et warning ? Si ce n'est pas le cas, tes scalaires $maxSum et autres ont ils une portée au dela du foreach externe ?

    J'en suis navré, mais ton post m'amène plus de questions que de réponses

    Peux tu nous en dire plus sur ce que tu vises à obtenir ?

    Bon perl
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Re: Tri par valeur d un hash de hash
    Citation Envoyé par 2Eurocents
    Bonjour,

    Citation Envoyé par LeLaulau
    Je cherche a trier par valeur un hash de hash.
    Avant d'aller plus loin, j'aimerai savoir ce que tu veux dire par là ...
    Je veux les 2 clefs (celle du hash externe et du hash interne) qui ont la valeur du hash imbrique la plus forte.

    Pourquoi faire un foreach $i_clust2 ... si c'est pour sauter directement à la dernière itération lors de la première ?
    Je voulais au debut pas faire d iteration, je voulais juste la valeur maximale... j'ai pas eu de meilleure idee que faire ca. (je voulais utiliser la fonction sort pour pas tout parcourir...)

    As tu fait usage des pragma strict et warning ? Si ce n'est pas le cas, tes scalaires $maxSum et autres ont ils une portée au dela du foreach externe ?
    Je ne sais pas ce que sont les pragma stricts... (hmm je sais, je devrais me mettre a un vrai livre sur perl et pas apprendre aussi empiriquement )
    Et warning, je sais pas...j utilise "perl -w"

    J'en suis navré, mais ton post m'amène plus de questions que de réponses
    vi... j etais pas assez clair
    Mais en tout cas merci pour toute l aide que tu m apportes deja. Tu vaux definitivement plus que 2 cents!![/quote]

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut Re: Tri par valeur d un hash de hash
    Citation Envoyé par LeLaulau
    Je veux les 2 clefs (celle du hash externe et du hash interne) qui ont la valeur du hash imbrique la plus forte.
    Ok.

    Citation Envoyé par LeLaulau
    Je voulais au debut pas faire d iteration, je voulais juste la valeur maximale... j'ai pas eu de meilleure idee que faire ca. (je voulais utiliser la fonction sort pour pas tout parcourir...)
    Oui, mais la fonction sort parcourt pour toi, ce qui finalement ne change pas forcément grand chose

    Citation Envoyé par LeLaulau
    Je ne sais pas ce que sont les pragma stricts... (hmm je sais, je devrais me mettre a un vrai livre sur perl et pas apprendre aussi empiriquement )
    Et warning, je sais pas...j utilise "perl -w"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use warnings;
    use strict;
    en début de script, sauve parfois des heures nocturne de débuggage



    Maintenant, pour ton problème, il y a plusieurs façons de le traiter.

    L'une d'entre elles serait :
    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
    #!/usr/bin/perl
     
    use warnings;
    use strict;
     
    my %hash=();
    $hash{1}{4}=10;
    $hash{1}{6}=4;
    $hash{4}{4}=2;
    $hash{2}{9}=10;
    $hash{2}{4}=2;
    $hash{4}{1}=12;
     
    my @clefs = map { my $ext=$_; map { [ $ext, $_ ] } keys (%{$hash{$_}}) } keys (%hash);
    # parcours imbriqué et systématique des deux hachages
    # Pour générer une liste de couples de clefs.
    # @clefs contient des paires de clefs (clef_hash_externe, clef_hash_interne)
    # Ces paires de clefs sont dans une référence anonyme à une liste ... penser à déréférencer en liste, à l'usage.
     
    my @sorted_keys = sort { $hash{@$a[0]}{@$a[1]} <=> $hash{@$b[0]}{@$b[1]}} @clefs;
    # On trie ces paires de clefs sur la valeur doublement hachée.
     
    print $sorted_keys[-1][0]."/".$sorted_keys[-1][1]."\n";
    # Et on affiche la paire de clef donnant la plus grande valeur :
    # La dernière de la liste, de rang -1.
    Ce n'est pas optimal (parcours systématique + tri), pas forcément très lisible (l'abus de sigills dans tous les coins nuit gravement à ma migraine), mais cela marche.

    Bon courage pour la suite.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour tout!

    Et grace a toi j ai decouvert la merveilleuse fonction "map".. honte sur moi je l utilisais pas, mais la je viens de remarquer que je vais economiser beaucoup de lignes de codes )

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/12/2007, 15h24
  2. tableau comme valeur dans un hash de hash
    Par king_kunu dans le forum Langage
    Réponses: 2
    Dernier message: 02/01/2006, 16h05
  3. Parcours d'un hash de hash de hash
    Par ngere dans le forum Langage
    Réponses: 5
    Dernier message: 06/07/2005, 09h53
  4. Tri par la moyenne des valeurs de champs ?
    Par rozwel dans le forum Requêtes
    Réponses: 8
    Dernier message: 28/01/2005, 18h35
  5. [langage] Tri de valeurs dans un hash
    Par Arioch dans le forum Langage
    Réponses: 2
    Dernier message: 15/11/2004, 11h35

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