返回具有最大值的所有哈希键/值对
我有一个散列(在 Perl 中),其中值都是数字。我需要创建另一个哈希,其中包含第一个哈希中的所有键/值对,其中该值是所有值中的最大值。
例如,假设
my %hash = (
key1 => 2,
key2 => 6,
key3 => 6,
);
我想创建一个新的哈希,其中包含:
%hash_max = (
key2 => 6,
key3 => 6,
);
我确信有很多方法可以做到这一点,但我正在寻找一个优雅的解决方案(以及学习的机会!)。
I have a hash (in Perl) where the values are all numbers. I need to create another hash that contains all key/value pairs from the first hash where the value is the maximum of all values.
For example, given
my %hash = (
key1 => 2,
key2 => 6,
key3 => 6,
);
I would like to create a new hash containing:
%hash_max = (
key2 => 6,
key3 => 6,
);
I'm sure there are many ways to do this, but am looking for an elegant solution (and an opportunity to learn!).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
或者一次性方法(与另一个答案类似但略有不同):
Or a one-pass approach (similar to but slightly different from another answer):
这使得一次数据传递,但浪费了大量的哈希写入:
This makes one pass over the data, but wastes a lot of hash writes:
然后将顶部值复制到 %hash_max,并在最后一个最大值后添加循环终止符:
ETA:请注意,
last
有效,因为@topkey
中的键已排序,因此当该值不再像第一个值时,我们可以中断循环。即以下所有值都较低。Then copy the top values to %hash_max, with a loop terminator after the last max value:
ETA: Note to the unbelievers that
last
works because the keys in@topkey
are sorted, so we can break the loop when the value is no longer like the first one. I.e. all the following values are lower.