【问题标题】:Transform 2D array into hash将二维数组转换为哈希
【发布时间】:2016-05-08 03:27:34
【问题描述】:

我有一个排序的二维数组,如下所示:

a = [[1, 2011], [3, 1999], [4, 2014], [6, 1998], ...]

如何将其转换为以年份为键、前面为数字的哈希值?

{2011 => 1, 1999 => 3, 2014 => 4, 1998 => 6, ...}

【问题讨论】:

    标签: ruby multidimensional-array hash ruby-1.8.7


    【解决方案1】:
    [[1, 2011], [3, 1999], [4, 2014], [6, 1998]].map(&:reverse).to_h
      # => {2011=>1, 1999=>3, 2014=>4, 1998=>6}
    

    对于旧版本的 Ruby,您可以使用:

    Hash[a.map(&:reverse)]
    

    【讨论】:

    • 我认为 to_h 只能用于 Ruby 2.1 或更高版本。但是,我需要使用 Ruby 1.8.7。还有其他方法吗?
    • @Alan1, x.to_h 可以替换为Hash[x]
    • 收到错误:test.rb:2: undefined method `map' for nil:NilClass (NoMethodError)
    • @Alan1,那么你的数组是nil
    • @Alan1,我不确定我明白你的意思,甚至不确定它与问题的关系。
    【解决方案2】:

    以下是对 1.8.7 友好的其他几种方式:

    a = [[1, 2011], [3, 1999], [4, 2014], [6, 1998]]
    
    v, y = a.transpose
    Hash[y.zip(v)]
      #=> {2011=>1, 1999=>3, 2014=>4, 1998=>6}
    
    a.reduce({}) { |h,(v,y)| h.update({ y=>v }) }
      #=> {2011=>1, 1999=>3, 2014=>4, 1998=>6}
    

    Hash#update(又名merge!)可以替换为Hash#merge

    【讨论】:

      【解决方案3】:

      这是另一种方法。

      a.each.with_object({}) {|(v,k), h| h[k] = v}
      

      【讨论】:

        猜你喜欢
        • 2011-01-16
        • 2019-07-14
        • 2017-11-22
        • 1970-01-01
        • 2019-10-27
        • 2019-05-23
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        相关资源
        最近更新 更多