我在使用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)
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)
尝试这个:
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)