удаление дублирующего хеш-значения и его подсчет в perl - PullRequest
0 голосов
/ 09 июня 2009

Скажем,

%hash = (
        key1 => 'one',
        key2 => 'two',
        key3 => 'three',
        key4 => 'two',
        key5 => 'one',
);

Я хочу иметь два массива:

  1. Этот массив должен иметь уникальный ключ / значение

    @ array1 = (ключ1 один ключ2 два ключа3 три)

  2. этот массив должен иметь количество дубликатов по значению (например, здесь только три значения уникальны, поэтому «один» найден дважды, а «два» найден дважды и «три» найден один раз »)

    @ array2 = (2 2 1)

Ответы [ 3 ]

2 голосов
/ 09 июня 2009

Игнорирование вопроса заказа ...

#!/usr/bin/perl

use strict;
use warnings;

my %hash = qw( key1 one key2 two key3 three key4 two key5 one );

my %counts;
$counts{ $_ }++ for values %hash;

my %uniq = reverse %hash;

my (@array1, @array2);

while ( my ($k, $v) = each %uniq ) {
    push @array1, $v, $k;
    push @array2, $counts{$k};
}

use Data::Dumper;
print Dumper \@array1, \@array2;


__END__

C:\Temp> t.pl
$VAR1 = [
          'key3',
          'three',
          'key5',
          'one',
          'key2',
          'two'
        ];
$VAR2 = [
          1,
          2,
          2
        ];
1 голос
/ 09 июня 2009

Я не уверен, почему вы хотите, чтобы окончательный ответ был в этой странной форме (в отличие от хэша уникального ключа / значений и хэша значения => отображения количества , но здесь вы идти ...

Вы также можете напрямую использовать хэш% count вместо помещения значений в массив, как вы хотели выше.

use strict; 
use Data::Dumper;

my %hash = ( key1 => "one", key2 => "two", key3 => "three", key4 => "two", key5 => "one" );
my %counts = ();
my @counts = ();
my %unique = ();
foreach my $key (sort keys %hash) {
    my $value = $hash{$key}; 
    if (not exists $counts{$value}) {
        $unique{$key} = $value;
    }
    $counts{$value}++;
};
my @unique_keys = sort keys %unique; # Fix the sorting to your desired one 
                                     # if default is not what you meant

# You can also use %counts hash directly 
#instead of pushing values into an array as you wanted above.
foreach my $key (@unique_keys) {
    push @counts, $counts{ $unique{$key} }
};

# Print
print Data::Dumper->Dump([\@unique_keys, \@counts, \%unique],  
                         ["unique_keys", "counts", "unique"] ) ; 

Результаты:

$unique_keys = [
                 'key1',
                 'key2',
                 'key3'
               ];
$counts = [
            2,
            2,
            1
          ];
$unique = {
            'key2' => 'two',
            'key1' => 'one',
            'key3' => 'three'
          };
0 голосов
/ 12 июня 2009
my %hash = (
        key1 => 'one',
        key2 => 'two',
        key3 => 'three',
        key4 => 'two',
        key5 => 'one',
);

my %counts;

$counts{$_}++ foreach values %hash;

my @elements = keys %hashes;

my @frequency = values %hashes;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...