Сортировка многомерных хэшей в perl по значению в определенном ключе - PullRequest
0 голосов
/ 23 октября 2011

Заранее спасибо за помощь.

У меня есть массив с именем %pepHash с 174 «счетчиками» и несколькими «пептидами» в каждом $count. Вот фрагмент хеша:

Count: 39   Peptide: 0  Score: 55.03    MR: 1792.3206
Count: 39   Peptide: 1  Score: 75.22    MR: 1792.6158
Count: 39   Peptide: 2  Score: 62.63    MR: 1972.7156
Count: 39   Peptide: 3  Score: 49.95    MR: 2365.2174
Count: 40   Peptide: 0  Score: 46.38    MR: 1256.4437
Count: 40   Peptide: 1  Score: 71.07    MR: 1950.1644
Count: 40   Peptide: 2  Score: 71.77    MR: 2492.9394
Count: 40   Peptide: 3  Score: 67.28    MR: 2493.0154

Во-первых, я не очень хорошо разбираюсь в структурах данных, так что лучше бы посоветоваться с несколькими хешами.

Count: 40   Peptide: 1  Score: 71.07    MR: 1950.1644 

доступен $pepHash[$count][$pepCount]{$PEP_SCORE} или {$PEP_MR}, и в этом случае это, очевидно, $pepHash[40][1]{$PEP_SCORE}. Я хочу отсортировать все %pepHash по его оценкам в порядке убывания или создать новый отсортированный хэш, чтобы список стал:

Count: 39   Peptide: 0  Score: 75.22    MR: 1792.6158  
Count: 39   Peptide: 1  Score: 62.63    MR: 1972.7156 
Count: 39   Peptide: 2  Score: 55.03    MR: 1792.3206 
Count: 39   Peptide: 3  Score: 49.95    MR: 2365.2174
Count: 40   Peptide: 0  Score: 71.77    MR: 2492.9394 
Count: 40   Peptide: 1  Score: 71.07    MR: 1950.1644
Count: 40   Peptide: 2  Score: 67.28    MR: 2493.0154
Count: 40   Peptide: 3  Score: 46.38    MR: 1256.4437

Обратите внимание на обновленные значения $pepCount. У меня есть этот цикл, который может быть полезен:

   for ($count = 0; $count < $total; $count++) {
      for ($pepCount = 0; $pepCount < $pepTotal[$count]; $pepCount++) {
      }
   }

Я тоже бездельничал, потому что я нуб:

foreach $key (sort {$pepHash{$b} <=> $pepHash{$a}} keys(%pepHash)) {
   #CONFUSED
}

РЕДАКТИРОВАТЬ: Это мне очень помогло: http://www.stathis.co.uk/computers/perl-sort-tutorial

1 Ответ

2 голосов
/ 23 октября 2011

Для хранения таких структур данных вы можете использовать хэш хэшей. Вот пример:

my %pepHash;

$pepHash{someKey} = { Score => 100, Count => 42 };
$pepHash{someOtherKey} = { Score => 200, Count => 43 };
# ...

А затем сортируйте этот хеш:

foreach $key (sort {$pepHash{$b}->{Score} <=> $pepHash{$a}->{Score}} keys(%pepHash)) {
   my $data = $pepHash{$key};
   print "$key: Score - $data->{Score}, Count - $data->{Score}\n";
}

Вы также можете прочитать документацию по Perl , чтобы чувствовать себя лучше со структурами данных Perl и perldoc -f sort , чтобы узнать больше о сортировке в Perl.

Удачи!

...