Arhn - архитектура программирования

Как получить верхние ключи из хеша по значению

У меня есть хэш, который я отсортировал по значениям от наибольшего к наименьшему. Как мне попасть в топ-5? Здесь был пост, в котором говорилось о получении только одного значения.

Как проще всего получить ключ с наибольшим значением из хеша в Perl?

Я понимаю, что, скажем, получение этих значений добавляет их в массив и удаляет элемент в хеше, а затем повторяет процесс снова?

Кажется, что должен быть более простой способ сделать это, чем это.

Мой хеш называется %words.

Отредактировано Вынул код, поскольку на вопрос ответили, не нуждаясь в нем.

04.12.2012

  • «У меня есть хэш, который я отсортировал… Нет. Вы не можете сортировать хэш. 04.12.2012
  • Нет, вы не можете, я имею в виду, что я напечатал их по порядку, но я хочу взять 5 лучших с наибольшим значением. 04.12.2012
  • s/[\,|\.|\!|\?|\:|\;|\"]//g Вы не должны использовать чередование внутри квадратных скобок класса символов, и вам не нужно экранировать символы (кроме - и ]): s/[,.!?:;"]//g for @words. Или используйте tr/,.!?:;"//d. 04.12.2012
  • Хм... вы уже отсортировали ключи в массив @keys. Вам нужно только взять первые пять элементов из этого массива. 04.12.2012

Ответы:


1

Ваш вопрос заключается в том, как получить пять самых высоких значений из вашего хеша. У вас есть этот код:

my @keys = sort {
    $words{$b} <=> $words{$a}
    or
    "\L$a" cmp "\L$b"
} keys %words;

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

my @highest = splice @keys, 0, 5;  # also deletes the keys from the array
my @highest = @keys[0..4];         # non-destructive solution

Также некоторые комментарии к вашему коду:

open( my $filehandle0, '<', $file0 ) || die "Could not open $file0\n";

Рекомендуется включить сообщение об ошибке $! в оператор die, чтобы получить ценную информацию о том, почему не удалось открыть.

for (@words) {
    s/[\,|\.|\!|\?|\:|\;|\"]//g;
}

Как я уже сказал в комментарии, вам не нужно экранировать символы или использовать чередование в скобках классов символов. Используйте либо:

s/[,.!?:;"]//g for @words;   #or
tr/,.!?:;"//d  for @words;

Следующая часть немного странная.

my @stopwords;
while ( my $line = <$filehandle1> ) {
    chomp $line;
    my @linearray = split( " ", $line );
    push( @stopwords, @linearray );
}
for my $w ( my @stopwords ) {
    s/\b\Q$w\E\B//ig;
}

Вы читаете стоп-слова из файла... а затем удаляете стоп-слова из $_? Вы вообще используете $_ в данный момент? Более того, вы повторно объявляете массив @stopwords в заголовке цикла, что фактически означает, что ваш новый массив будет пустым, и ваш цикл никогда не запустится. Эта ошибка кажется тихой, поэтому вы можете ее никогда не заметить.

my %words = %words_count;

Здесь вы делаете копию %words_count, что кажется излишним, поскольку вы никогда больше его не используете. Если у вас большой хэш, это может снизить производительность.

my $key_count = 0;
$key_count = keys %words;

Это можно сделать одной строкой: my $key_count = keys %words. Читабельнее, на мой взгляд.

$value_count = $words{$key} + $value_count;

Также может быть сокращено оператором +=: $value_cont += $words{$key}

Очень хорошо, что вы используете strict и warnings.

04.12.2012
  • вы были очень полезны. Вы ответили больше, чем я спрашивал. Спасибо, что указали на мои недостатки. Я использовал много вещей, которые я читал или видел в Интернете. Затем я адаптирую его к своему коду. Я действительно многому научился, работая над этим проектом. Спасибо вам за помощь. Ваше здоровье. 05.12.2012
  • Хотя я не уверен, что плохого в моих стоп-словах. 05.12.2012
  • Замена по умолчанию применяется к $_, поэтому s/foo// означает $_ =~ s/foo//. В вашем цикле я не знаю, на какой $_ вы ссылаетесь. Если это предназначено для применения к $w, то вы просто удаляете все из массива @stopwords. 05.12.2012
  • Моим намерением было убедиться, что ни одно из стоп-слов уже не объявлено оператором в Perl. Я где-то читал, что это хорошая практика. Однако, возможно, я применил его неправильно. 05.12.2012
  • Я предполагаю, что вы имеете в виду метасимволы. Но это не имеет значения, если вы не используете их в регулярном выражении. Любые символы, используемые в хеш-ключе, являются буквальными, так что не беспокойтесь. 05.12.2012

  • 2

    Если производительность не имеет большого значения

    (sort {$words{$a} <=> $words{$b}} keys %words)[0..4])
    

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

    my @results;
    for (0..4) {
      my $maxkey;
      my $max = 0;
    
      for my $key (keys %words){
        if ($max < $words{$key}){
          $maxkey = $key;
          $max = $words{$key};
         }
      }
      push @results, $maxkey;
      delete $words{$maxkey};
    }
    
    say join(","=>@results);
    
    04.12.2012
  • Скорость на самом деле не проблема сейчас, но я посмотрю на скорость, потому что то, что я делаю в больших масштабах, потребует скорости. Спасибо за помощь. 04.12.2012

  • 3

    Для этого есть модуль CPAN, Sort::Key::Top. Он имеет простой интерфейс и эффективную реализацию XS:

    use Sort::Key::Top qw(rnkeytop);
    
    my @results = rnkeytop { $words{$_} } 5 => keys %words;
    
    04.12.2012
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..