减少哈希值(Reduce Hash Values)

2019-08-04 03:21发布

我有语法为减少麻烦。 我有以下格式的哈希:

H = {"Key1" => 1, "Key2" => 2}

我想用减少查找值的总和此功能。

就像是

H.reduce(0) {|memo, elem| memo+=elem}

我知道这是不对的。 我不明白我怎么能做出ELEM的哈希值。

Answer 1:

使用Enumerable#reduce ,如果你确定与获得nil如果哈希恰好是空的:

H.values.reduce(:+) # => 3
Hash.new.values.reduce(:+) # => nil

为了安全地获得0时哈希是空的,使用方法:

H.values.reduce(0) { |sum,x| sum + x } # or...
H.reduce(0) { |sum,(key,val)| sum + val } # ...if you need to inspect the key

这里有一个快速的基准,踢。 请注意,这似乎是稍快,以减少刚值,而不是从键/值对的值:

                               user     system      total        real
H.values.reduce(:+)        4.510000   0.080000   4.590000 (  4.595229)
H.values.reduce(0) {...}   4.660000   0.080000   4.740000 (  4.739708)
H.reduce(0) {...}          5.160000   0.070000   5.230000 (  5.241916)
require 'benchmark'

size = 1_000
hash = Hash[* Array.new(size*2) { rand } ]

N=10_000
Benchmark.bm(24) do |x|
  x.report('H.values.reduce(:+)')      { N.times { hash.dup.values.reduce(:+) } }
  x.report('H.values.reduce(0) {...}') { N.times { hash.dup.values.reduce(0) { |sum,x| sum + x } } }
  x.report('H.reduce(0) {...}')        { N.times { hash.dup.reduce(0) { |sum,(_,v)| sum + v } } }
end


Answer 2:

您可以elem由2个变量分裂它包含的价值:

H.reduce(0) {|memo, (key, val)| memo += val}


Answer 3:

试试这个:

H.reduce(0) { |memo, elem| memo += elem[1] }

要么

H.reduce(0) { |memo, (key, value)| memo += value }


Answer 4:

我知道我在挖掘这一个,但如果你碰巧使用Rails的,该.sum方法可以帮助:

H = {"Key1" => 1, "Key2" => 2}
=> {"Key1"=>1, "Key2"=>2}
> H.values.sum
=> 3

优点是,它返回0的空哈希:

> {}.values.sum
=> 0
> {}.values.reduce(:+)
=> nil

我注意到它只是打字这样的回答后,Rails的具体。 我知道OP没有添加Rails的标签,但我想它可能是人串门有用。

请注意,例如Ruby 2.4.0的, .sum现在可用 。



Answer 5:

h = {"Key1" => 1, "Key2" => 2}

h.values.inject(0){|f,v| f += v.to_i }
# => 3

要么

h.values.inject(:+)
# => 3


文章来源: Reduce Hash Values
标签: ruby hash reduce