Получить все соответствующие ключи для повторяющихся элементов - PullRequest
1 голос
/ 01 марта 2011

У меня есть файл, который состоит из следующих элементов:

A  1
A  2
B  3
B  4
B  5
B  6
C  7
A  8  

Я хочу получить все уникальные ключи в первом столбце, но получить все соответствующие значения для этого уникального ключа, т.е. мне нужно получить:

A 1,2,8
B 3,4,5,6
C 7

Как лучше всего это сделать?
(Я слышал, что Perl имеет хорошую поддержку для решения этой проблемы, но я новичок в Perl.)

Ответы [ 3 ]

8 голосов
/ 01 марта 2011

попробуйте это:

open my $fh, '<', "data_filename";
my %map;

while(my $line = <$fh>) {
  my ($key, $val) = split(/\s+/, $line);
  push @{$map{$key}}, $val;
}
3 голосов
/ 01 марта 2011

Возможно, вам нужен хеш, где каждое значение в хэше является массивом ссылка .

my %values;
while (<>) {
    my ($left, $right) = split(/ /,$_,2);
    my $array = $values{$left};
    if (!$array) {
        $array = [];
        $values{$left} = $array;
    }
    push(@{$array},$right);
}

Вы можете проверить, что это создало правильную структуру данных, с помощью Data :: Dumper :

use Data::Dumper;
print Dumper(\%values);
0 голосов
/ 01 марта 2011

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


use warnings;
use strict;

my %hash = ();
open (FILE, "input.txt") or die "";
while(FILE>){
chomp;
(my $key, my $value) = split;
    $value = ",".$value if exists $hash{$key};
    $hash{$key}.= $value;
}

foreach my $key (sort keys %hash){
    print "$key $hash{$key}\n";
}

Как всегда, есть несколько способов сделать это.

...