为Ruby哈希同时设置多个键的值

6

我正在尝试创建一个巨大的哈希表,其中包含许多键但只有少数值。

到目前为止,我的代码如下所示...

du_factor = {
  "A" => 1,
  "B" => 1,
  "C" => 1,
  "D" => 2,
  "E" => 2,
  "F" => 2,

……等等,等等,等等,比你想象的时间长。如果不完全颠倒结构,有没有更简短和更优雅的方法来创建这个哈希表?

编辑:嘿,我意识到有一个比给出答案更容易和更优雅的方法。只需声明一个空哈希表,然后声明一些具有所需键的数组,并使用for语句将它们插入到数组中,如下所示:

du1 = ["A", "B", "C"]
du2 = ["D", "E", "F"]

dufactor = {}

for i in du1
  dufactor[i] = 1
end

for i in du740
  dufactor[i] = 2
end

... 但是没有人建议这样做,这让我这个极度新手的 Ruby 程序员想到,这样做可能有原因。性能问题?


2
key => value关系背后是否有逻辑? - Myst
哈希表是加速查找的好方法,但并非适用于所有问题,因此要为认识到这一点而加1。也许[codereview.se]会是更好的提问选择。 - the Tin Man
没有关系。实际上它并不是"A"、"B"、"C"等,而是"R6"、"R6A"等,基本上是随机的。 - Stephen Smith
5个回答

4

结合范围和一个case块可能是另一种选择(取决于您要解决的问题):

case foo
when ('A'..'C') then 1
when ('D'..'E') then 2
# ...
end

尤其是如果你专注于提高源代码的可读性。


可读性至上!尽管第二个“when”应该返回2。 - the Tin Man

1
怎么样:
vals_to_keys = {
  1 => [*'A'..'C'],
  2 => [*'D'..'F'],
  3 => [*'G'..'L'],
  4 => ['dog', 'cat', 'pig'],
  5 => [1,2,3,4]
}

vals_to_keys.each_with_object({}) { |(v,arr),h| arr.each { |k| h[k] = v } }
  #=> {"A"=>1, "B"=>1, "C"=>1, "D"=>2, "E"=>2, "F"=>2, "G"=>3, "H"=>3, "I"=>3,  
  #    "J"=>3, "K"=>3, "L"=>3, "dog"=>4, "cat"=>4, "pig"=>4, 1=>5, 2=>5, 3=>5, 4=>5}

1
这个怎么样:
du_factor = Hash.new
["A", "B", "C"].each {|ltr| du_factor[ltr] = 1}
["D", "E", "F"].each {|ltr| du_factor[ltr] = 2}

# Result:
du_factor # => {"A"=>1, "B"=>1, "C"=>1, "D"=>2, "E"=>2, "F"=>2}

创建一个空哈希表,然后对于每组共享值的键,创建一个包含这些键的数组,并使用该数组的“.each”方法批量输入它们到哈希表中。基本上和上面用for循环做的一样,但只需要三行代码即可完成。

0
keys = %w(A B C D E F)
values = [1, 1, 1, 2, 2, 2]
du_factor = Hash[*[keys, values].transpose.flatten]

如果这些内容超过100个,将它们写入CSV文件可能会更好。

0
keys = [%w(A B C), %w(D E F)]
values = [1,2] 
values.map!.with_index{ |value, idx| Array(value) * keys[idx].size }.flatten!
keys.flatten!
du_factor = Hash[keys.zip(values)]

注意这里我使用了破坏性方法(以!结尾的方法)。这对于性能和内存使用优化非常重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接