in reply to Summarize or Consolidate array by value?

Not sure why you want it as arrays -- this is ideal for a hash:

my @array = qw( a a b c d d ); my %counts; $counts{$_}++ for @array; # if you really want arrays back at the end: my @keys = keys %counts; my @vals = values %counts;

-xdg

Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

Replies are listed 'Best First'.
Re^2: Summarize or Consolidate array by value?
by blazar (Canon) on Jan 16, 2006 at 15:29 UTC

    Indeed, however I wonder if order counts for the OP, i.e.: should

    qw/a a b c d d a/

    map to

    user wants? (a => 2, b => 1, c => 1, d => 2, a => 1): # or (a => 3, b => 1, c => 1, d => 2);

    I guess the latter, but still preserving the input order, in which case the common technique for uniq'ing a list can be easily adapted to do it:

    my %saw; my @sum=map {$_ => $saw{$_}} grep !$saw{$_}++, @array;

    Now that I think of it, this can be even adapted for the former task, provided that grep's selection is improved to delete the key is it's not the same as the previous one. I'd probably chose a completely different strategy, though.