Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

Re^2: min and max in a hash of hash

by wwe (Friar)
on Jul 12, 2010 at 16:30 UTC ( #849041=note: print w/replies, xml ) Need Help??

in reply to Re: min and max in a hash of hash
in thread min and max in a hash of hash

Hi ikegami, could you enlighten me what is wrong on using List::Util? the following code works fine, after I corrected the hash provided:
foreach my $y (sort keys %Year) { my $min_y = List::Util::min values %{ $Year{$y} }; print "min of [$y] is [$min_y]\n"; }
Edit: this works for sure only if you doesn't care about the month of the min/max value.

Replies are listed 'Best First'.
Re^3: min and max in a hash of hash
by ikegami (Pope) on Jul 12, 2010 at 22:28 UTC

    That will give you the minimum value for each year. The OP wanted just the overall minimum. If he doesn't need the y/m of the minimum, then he could use

    use List::Util qw( min max ); my $min = min map { min values %{$Year{$_}} } keys %Year; my $max = max map { max values %{$Year{$_}} } keys %Year;

    Update: Fixed s/values/keys/ as per reply.

      hi, slight correction

      use List::Util qw( min max ); my $min = min map { min values %{$Year{$_}} } keys %Year; my $max = max map { max values %{$Year{$_}} } keys %Year;
      I believe he was interested in both the year and month as am I. I currently have the same issue. I have the same data structure using a hash of hash. I would like to report for each year, the month and value of the min and max value. How can your existing example be modified to accommodate this?

        Here's an example of how to accomplish this:

        use List::Util qw/min max/; my %results = map { my $year_ref = $data{$_}; my $min = min values %$year_ref; my $max = max values %$year_ref; my @min_months = grep { $year_ref->{$_} == $min } keys %$year_ref; my @max_months = grep { $year_ref->{$_} == $max } keys %$year_ref; $_ => { "min" => $min, "max" => $max, "min_months" => \@min_months, "max_months" => \@max_months } } keys %data;

        Note that this takes into account the possibility of there being several months that each have the minimum/maximum value; if your data for each year/month is guaranteed to be distinct, you could drop that and replace \@min_months with $min_months[0] and \@max_months with $max_months[0], respectively.

        There may well be a more concise way of doing this, too, but neither List::Util nor List::MoreUtils appears to contain versions of min and max that operate on key/value pairs (pairmin and pairmax? Now there'd be a worthwhile addition to these modules.)

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://849041]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (13)
As of 2017-02-23 19:04 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (350 votes). Check out past polls.