【问题标题】:Set multiple keys to the same value at once for a Ruby hash一次为 Ruby 散列设置多个键为相同的值
【发布时间】:2016-01-31 15:46:05
【问题描述】:

我正在尝试创建这个巨大的哈希,其中有很多键但只有几个值。

到目前为止,我都是这样......

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 n00b 认为我不应该这样做一定是有原因的。性能问题?

【问题讨论】:

  • key => value 关系背后有逻辑吗?
  • 哈希是加快查找速度的好方法,但并非适用于所有问题,因此 +1 表示认识到这不会走得更远。对于这个问题,Code Review 可能是更好的选择。
  • 没有关系。事实上,它实际上并不是“A”、“B”、“C”等,而是“R6”、“R6A”等——本质上是随机的。

标签: ruby hash


【解决方案1】:

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

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

特别是如果您关注源代码的可读性。

【讨论】:

  • 可读性 FTW!虽然第二个 when 应该返回 2。
【解决方案2】:

怎么样:

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}

【讨论】:

    【解决方案3】:

    这样的事情怎么样:

    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 循环中所做的相同,但它只需三行即可完成。

    【讨论】:

      【解决方案4】:
      keys = %w(A B C D E F)
      values = [1, 1, 1, 2, 2, 2]
      du_factor = Hash[*[keys, values].transpose.flatten]
      

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

      【讨论】:

        【解决方案5】:
        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)]
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-30
          • 1970-01-01
          • 2018-07-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多