【问题标题】:Better way for array to hash conversion数组到哈希转换的更好方法
【发布时间】:2014-08-27 10:37:48
【问题描述】:

我有一个数组,我想将它转换为哈希。我希望数组元素是键,并且所有值都相同。

这是我的代码:

h = Hash.new
myarr.each do |elem|
  h[elem] = 1
end

另一种选择是following。我不认为它与上面的解决方案有很大不同。

h = Hash[ *myarr.collect { |elem| [elem, 1] }.flatten ]

有没有更好的方法可以做到这一点?

【问题讨论】:

    标签: ruby arrays hash ruby-1.9


    【解决方案1】:

    OP写的代码,也可以写成:-

    a = %w(a b c d)
    Hash[a.each_with_object(1).to_a]
    # => {"a"=>1, "b"=>1, "c"=>1, "d"=>1}
    

    如果你的 Ruby 版本 >= 2.1,那么

    a.each_with_object(1).to_h
    # => {"a"=>1, "b"=>1, "c"=>1, "d"=>1}
    

    【讨论】:

      【解决方案2】:

      首先,Hash[] 很高兴得到一个数组数组,所以你可以扔掉 splat 和 flatten,然后这样说:

      h = Hash[myarr.map { |e| [ e, 1 ] }]
      

      我想你可以改用each_with_object

      h = myarr.each_with_object({}) { |e, h| h[e] = 1 }
      

      另一种选择是zip 你的myarr 带有适当的1s 数组,然后将其提供给Hash[]

      h = Hash[myarr.zip([1] * myarr.length)]
      

      不过我可能会使用第一个。

      【讨论】:

        【解决方案3】:

        如果您使用的是 Ruby 2.1:

        myarr.map{|e| [e,1]}.to_h
        

        另一种聪明的方法(来自@ArupRakshit 的评论):

        myarr.product([1]).to_h
        

        【讨论】:

        • OP 明确表示他们正在使用 Ruby 1.9.3(尽管我将其移至 ruby​​-1.9 标签)。
        • 啊,好的。也许我会删除。
        • 我把它留在这里,人们在寻找通用 Ruby 解决方案时可能会遇到这个问题,所以这是一个值得回答的问题。
        • 你是对的,@Arup。我knew that :) 已修复。
        • +1 告诉我的方式很聪明。 :-) 事实是我也知道,但是当你写 2.0 时,我失去了信心,不得不去 doco 仔细检查它..
        【解决方案4】:

        这是另一种选择,使用cycle

        Hash[a.zip([1].cycle)]
        

        【讨论】:

        • 我也很喜欢这个简单的答案。
        【解决方案5】:
        a.each_with_object({}){|e, h| h[e] = 1}
        

        【讨论】:

        • 注意:这早于另一个毫不犹豫地发布完全相同解决方案的答案。
        • 提前 7 秒,因为我花时间纠正他们对 Hash[] 参数的误解,并花时间包含其他解决方案。
        • 及时性本身不应该转化为投票。一旦这篇文章发布了 2 年,没有人会关心答案何时到来。但是,如果它表明有人将别人的答案归功于他人,那将是一个问题。这显然不是这里的情况。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        • 2019-10-27
        • 2019-05-23
        • 2020-03-17
        • 2012-01-16
        • 1970-01-01
        • 2010-12-11
        相关资源
        最近更新 更多