2012-12-14 10 views
22

reduceの構文に問題があります。私は、この関数の値の総和を見つけるために減らす使用したいハッシュ値を減らす

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

:私は、次の形式のハッシュを持っています。私は、これは間違っている知っている

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

同様

何か。私はどのように私がハッシュの値をelemにすることができるのかわかりません。

+6

試行:H.values.reduce(:+) –

+0

ありがとうございます!それはトリックをしました – richsoni

答えて

27

使用Enumerable#reduceを空:

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 
+0

ハッシュが空の場合、これは0を返しません。 cool(key、val)proc argの構文には、 –

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

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

または

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

このお試しください:ハッシュがあることを起こる場合は、nilを取得して、OKなら、

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

または

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

私は 'memo + value'を書いて、' memo'の更新が役に立つと思うようにするでしょう。 – lkuty

64

あなたはelemは2つの変数の中にそれを分割することで値を含めることができます。

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

+1のメモバージョンを使用する必要があります。 – maerics

+1

これは華やかです。 – jturolla

+3

「メモ」の更新が有用であると人々に考えることを避けるために、私は 'メモ+値'を書いたでしょう。 – lkuty

1

は、私は私はこの1つを掘削しています知っていますが、Railsのを使用するために起こる場合は、.sum methodは助けることができる:

H = {"Key1" => 1, "Key2" => 2} 
=> {"Key1"=>1, "Key2"=>2} 
> H.values.sum 
=> 3 
私はそれだけでこの答えを入力した後のRails固有気づいた

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

利点は、それが空のハッシュに0を返すということです。私はOPがRailsタグを追加していないことを知っていますが、それは人が止まるのに便利かもしれないと思いました。

Ruby 2.4.0以降、.sum is now availableに注意してください。

+1

'.sum'がRuby 2で実装されました。4 [Enumerable#sum](https://ruby-doc.org/core-2.4.0/Enumerable.html#method-i-sum)。 – user3162553

+0

良いキャッチ、私は私の答えで、感謝のメモを追加! – astorije

関連する問題