减少哈希值

ric*_*oni 30 ruby hash reduce

我在使用reduce的语法时遇到问题.我有以下格式的哈希:

H = {"Key1" => 1, "Key2" => 2}
Run Code Online (Sandbox Code Playgroud)

我想使用reduce来查找此函数中值的总和.

就像是

H.reduce(0) {|memo, elem| memo+=elem}
Run Code Online (Sandbox Code Playgroud)

我知道这是错的.我不明白如何使elem成为哈希值.

ste*_*lag 72

您可以elem通过将其拆分为2个变量来包含该值:

H.reduce(0) {|memo, (key, val)| memo += val}
Run Code Online (Sandbox Code Playgroud)

  • 为酷(key,val)proc arg语法+1! (12认同)
  • 我会写"memo + val"以避免让人们认为更新"备忘录"是有帮助的. (4认同)
  • 这很华丽. (2认同)

mae*_*ics 32

Enumerable#reduce如果您确定nil哈希恰好是空的,那么请使用:

H.values.reduce(:+) # => 3
Hash.new.values.reduce(:+) # => nil
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这是一个快速的基准,踢.请注意,仅减少值而不是键/值对中的值似乎稍微快一些:

                               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)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)


yas*_*asu 5

尝试这个:

H.reduce(0) { |memo, elem| memo += elem[1] }
Run Code Online (Sandbox Code Playgroud)

要么

H.reduce(0) { |memo, (key, value)| memo += value }
Run Code Online (Sandbox Code Playgroud)

  • 为了避免让人们认为更新“ memo”会有所帮助,我会写“ memo + value”。 (3认同)