2009-06-09 4 views
0

permet de direde suppression de valeur de hachage en double et en gardant un compte de celui-ci en Perl

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

Je veux avoir deux tableaux:

  1. Ce tableau devrait avoir clé unique/valeur

    @ array1 = (clé1 une clé2 deux clé3 trois)

  2. ce tableau doit avoir le nombre de doublons s par valeur (par exemple ici seulement trois valeurs sont uniques, donc 'un' est trouvé deux fois et 'deux' deux fois encore et 'trois' une fois).

    @ array2 = (2 2 1)

+0

ne signifie "clé/valeur unique" la clé ou la valeur doit être unique, ou la combinaison de clé et de valeur doit être unique, ou juste la clé doit être unique? – ysth

+0

Quelle commande assumez-vous pour @ array2. En d'autres termes, pourquoi le compte pour «un» vient avant le compte pour «deux»? – toolkit

+0

Qu'est ce qui détermine quelles clés sont conservées? Ne dites pas de commande car l'ordre dans lequel les clés sont renvoyées n'est pas le même pour les différents perl et ce n'est pas la même chose que l'ordre donné dans le fichier source. –

Répondre

1

Je ne sais pas pourquoi vous voulez la réponse finale soit sous cette forme étrange (par opposition à un hachage de clés uniques/valeurs et une hachage value => count correspondances, mais ici vous allez ...

vous pouvez également utiliser% compte hachage directement au lieu de pousser les valeurs dans un tableau que vous vouliez ci-dessus.

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"]) ; 

Résultats:

$unique_keys = [ 
       'key1', 
       'key2', 
       'key3' 
       ]; 
$counts = [ 
      2, 
      2, 
      1 
      ]; 
$unique = { 
      'key2' => 'two', 
      'key1' => 'one', 
      'key3' => 'three' 
      }; 
+0

Je suis assez nouveau à perl .... ouais je suis d'accord avec vous que l'on peut avoir hash avec clé unique/valeur ainsi. Je voulais en fait avoir un enregistrement de toutes les valeurs avec leurs clés respectives à compter. Je ne savais pas comment le faire en utilisant hash .... merci beaucoup ..... j'ai eu ce que je voulais ..... – Suren

2

Ignorant la question de l'ordre ...

#!/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 
     ]; 
+0

ouais. Même celui-ci fonctionne parfaitement avec mon problème. Je vous remercie. merci à vous tous. C'était mon premier article et je ne m'attendais jamais à une réponse aussi rapide et à des manières différentes de faire la même chose. – Suren

0
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;