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:
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?
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:
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 ;)
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.
Citation:
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...)
Citation:
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"
Citation:
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]
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:
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:
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.