【问题标题】:Create a hash from an array of keys从键数组创建哈希
【发布时间】:2012-03-27 19:11:11
【问题描述】:

我查看了 SO 中的其他问题,但没有找到针对我的具体问题的答案。

我有一个数组:

a = ["a", "b", "c", "d"]

我想将此数组转换为散列,其中数组元素成为散列中的键,并且所有相同的值都说 1。即散列应该是:

{"a" => 1, "b" => 1, "c" => 1, "d" => 1}

【问题讨论】:

    标签: ruby arrays hash


    【解决方案1】:

    我的解决方案,其中之一:-)

    a = ["a", "b", "c", "d"]
    h = Hash[a.map {|x| [x, 1]}]
    

    【讨论】:

      【解决方案2】:

      有几种选择:

      • to_h 有块:

        a.to_h { |a_i| [a_i, 1] }
        #=> {"a"=>1, "b"=>1, "c"=>1, "d"=>1}
        
      • product + to_h:

        a.product([1]).to_h
        #=> {"a"=>1, "b"=>1, "c"=>1, "d"=>1}
        
      • transpose + to_h:

        [a,[1] * a.size].transpose.to_h
        #=> {"a"=>1, "b"=>1, "c"=>1, "d"=>1}
        

      【讨论】:

        【解决方案3】:
        a = ["a", "b", "c", "d"]
        

        4 个更多选项,实现所需的输出:

        h = a.map{|e|[e,1]}.to_h
        h = a.zip([1]*a.size).to_h
        h = a.product([1]).to_h
        h = a.zip(Array.new(a.size, 1)).to_h
        

        所有这些选项都依赖于Array#to_h,在 Ruby v2.1 或更高版本中可用

        【讨论】:

          【解决方案4】:
          a = %w{ a b c d e }
          
          Hash[a.zip([1] * a.size)]   #=> {"a"=>1, "b"=>1, "c"=>1, "d"=>1, "e"=>1}
          

          【讨论】:

            【解决方案5】:

            这里:

            hash = Hash[a.map { |k| [k, value] }]
            

            根据上面的示例,这假定 a = ['a', 'b', 'c', 'd']value = 1

            【讨论】:

            • 你不需要flattenHash[]可以带一个Array of Arrays。
            • Hash[] 不幸的是似乎没有采用数组数组: Hash[ [1, 2], [3, 4] ] => {[1, 2]=>[3, 4]}
            • @AsfandYarQazi:那就这样做吧:Hash[ *[[1, 2], [3, 4]].flatten ]
            【解决方案6】:
            ["a", "b", "c", "d"].inject({}) do |hash, elem|
              hash[elem] = 1
              hash
            end
            

            【讨论】:

            • each_with_object 更适合这里。
            • @muistooshort 肯定是这样,但我在编码时使用的次数还不够多。谢谢! :)
            • 我经常使用它,因为块中的额外返回值看起来很孤独:)
            • @muistooshort 而且更重要的是我总是忘记它然后首先得到undefined method []=:P
            【解决方案7】:
            a = ["a", "b", "c", "d"]
            h = a.inject({}){|h,k| h[k] = 1; h}
            #=> {"a"=>1, "b"=>1, "c"=>1, "d"=>1}
            

            【讨论】:

              【解决方案8】:
              a = ['1','2','33','20']
              
              Hash[a.flatten.map{|v| [v,0]}.reverse]
              

              【讨论】:

                【解决方案9】:
                {}.tap{|h| %w(a b c d).each{|x| h[x] = 1}}
                

                【讨论】:

                  猜你喜欢
                  • 2022-01-10
                  • 1970-01-01
                  • 2011-04-20
                  • 2011-05-08
                  • 1970-01-01
                  • 2015-04-19
                  • 2018-01-23
                  • 2021-06-11
                  • 1970-01-01
                  相关资源
                  最近更新 更多