1

キーのハッシュとリストを結合したい
例:

a={"aa"=>[1, 2], "bbb"=>[3, 4, 5], "c"=>[6, 7, 8], "hh"=>[9]}
b=["aa","c"]

(b リストの要素は常にハッシュに存在します)

リストをハッシュで結合し、ハッシュの値を保持したいと考えています。したがって、次のものを取得する必要があります。

c={"aa"=>[1,2],"c"=>[6,7,8]}

それを行う最も速い方法は何ですか?私のハッシュには、最大 110.000 個のキーを含めることができます。
前もって感謝します

4

6 に答える 6

3
c = b.reduce({}) { |memo,x| memo[x]=a[x]; memo }
# => {"aa"=>[1, 2], "c"=>[6, 7, 8]} 

[編集]ちょっとしたきっかけとして、「reduce」、「each」、「set」のいくつかの戦略のベンチマークを次に示します。

require 'benchmark'
require 'set'
a = {"aa"=>[1, 2], "bbb"=>[3, 4, 5], "c"=>[6, 7, 8], "hh"=>[9]} 
b = ["aa", "c"]
n = 1_000
Benchmark.bm(8) do |x|
  x.report("reduce:") { n.times { b.reduce({}) { |memo,x| memo[x]=a[x]; memo } } }
  x.report("each:") { n.times { c={}; b.each{|key| c[key] = a[key]} } }
  x.report("set:") { n.times { bset=Set.new ['aa','c']; a.select{|k,v| bset.include? k} } }
end

このばかげたベンチマークでは、「each」が最も効率的であるように見えます。

               user     system      total        real
reduce:    0.000000   0.000000   0.000000 (  0.003384)
each:      0.010000   0.000000   0.010000 (  0.002549) # <-- winner!
set:       0.010000   0.000000   0.010000 (  0.012549)
于 2013-05-24T14:44:36.097 に答える
3

配列のトラバース:

a={"aa"=>[1, 2], "bbb"=>[3, 4, 5], "c"=>[6, 7, 8], "hh"=>[9]}
b=["aa","c"]
c = {}
b.each{|key| c[key] = a[key]}
#=>{"aa"=>[1, 2], "c"=>[6, 7, 8]}
于 2013-05-24T14:44:48.657 に答える
2
a = {"aa"=>[1, 2], "bbb"=>[3, 4, 5], "c"=>[6, 7, 8], "hh"=>[9]} 
b = ["aa", "c"] 
a.select{|k,v| b.include? k}
#=> {"aa"=>[1, 2], "c"=>[6, 7, 8]} 

セットは意味的に正しく、 からの線形検索よりも優れたパフォーマンスを発揮するため、セットの使用を検討する必要がありますArray#include?

require 'set'
a = {"aa"=>[1, 2], "bbb"=>[3, 4, 5], "c"=>[6, 7, 8], "hh"=>[9]} 
b = Set.new ["aa", "c"] 
a.select{|k,v| b.include? k}
#=> {"aa"=>[1, 2], "c"=>[6, 7, 8]} 
于 2013-05-24T14:31:05.893 に答える
1
b=["aa","c"]
a={"aa"=>[1, 2], "bbb"=>[3, 4, 5], "c"=>[6, 7, 8], "hh"=>[9]}
Hash[b.map{|i| a.assoc(i)}]
#=> {"aa"=>[1, 2], "c"=>[6, 7, 8]}
于 2013-05-24T14:55:27.073 に答える