首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby连接一个散列和一个列表+剩余值

Ruby连接一个散列和一个列表+剩余值
EN

Stack Overflow用户
提问于 2013-05-24 22:27:43
回答 6查看 138关注 0票数 1

我想连接一个散列的键和一个列表

示例:

代码语言:javascript
复制
a={"aa"=>[1, 2], "bbb"=>[3, 4, 5], "c"=>[6, 7, 8], "hh"=>[9]}
b=["aa","c"]

(b列表的元素将始终以散列形式出现)

我想用散列连接一个列表,并保留散列的值。因此,我需要获取以下内容:

代码语言:javascript
复制
c={"aa"=>[1,2],"c"=>[6,7,8]}

做这件事最快的方法是什么?我的a哈希可以包含多达110.000个键。

提前感谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-05-24 22:31:06

代码语言:javascript
复制
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?中的线性搜索要好得多。

代码语言:javascript
复制
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]} 
票数 2
EN

Stack Overflow用户

发布于 2013-05-24 22:44:36

代码语言:javascript
复制
c = b.reduce({}) { |memo,x| memo[x]=a[x]; memo }
# => {"aa"=>[1, 2], "c"=>[6, 7, 8]} 

编辑只是为了好玩,这里是几个策略的基准:"reduce","each“和"set":

代码语言:javascript
复制
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“是最有效的:

代码语言:javascript
复制
               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)
票数 3
EN

Stack Overflow用户

发布于 2013-05-24 22:44:49

遍历数组:

代码语言:javascript
复制
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]}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16737356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档