【问题标题】:Converting an array to hash - Ruby将数组转换为哈希 - Ruby
【发布时间】:2021-01-17 10:39:14
【问题描述】:

我有以下数组,我想将其转换为一个哈希,其中键为年龄,值如人名。另外,我想确保同龄人属于同一个钥匙。

ages = [ ['alpha', 20], ['beta',21], ['charlie',23], ['delta', 20] , ['gamma', 23]]

如何将上面的内容转换成下面的哈希?

例如 - {20 => ['alpha','delta'] }

我已经尝试了以下代码,但我被卡住了:

hash = Hash[ages.collect {|item| [item[1], item[0]]} ]

pp 哈希

谢谢。

【问题讨论】:

    标签: arrays ruby


    【解决方案1】:

    您可以先创建哈希,然后循环遍历年龄,将相似年龄的成员收集到数组中。

    hash = Hash.new{|h,k|h[k]=Array.new()}
    ages.each do |age|
      hash[age.last]<<age.first
    end
    p hash #{20=>["alpha", "delta"], 21=>["beta"], 23=>["charlie", "gamma"]}
    

    【讨论】:

      【解决方案2】:

      一种可能的解决方案是使用:

      hash = ages.each_with_object(Hash.new {|h,k| h[k] = [] }) do |obj, res|
        res[obj.last] << obj.first
      end
      
      => {20=>["alpha", "delta"], 21=>["beta"], 23=>["charlie", "gamma"]}
      
      1. Hash#default_proc
      2. Enumerable#each_with_object

      【讨论】:

        【解决方案3】:

        另一种方法:Hash#transform_valuesEnumerable#group_by

        ages.
          group_by(&:second).
          transform_values { |entries| entries.map(&:first) }
        # => {20=>["alpha", "delta"], 21=>["beta"], 23=>["charlie", "gamma"]}
        

        【讨论】:

        • &amp;:second?以前有rails标签吗?
        • 哈,老实说,我不记得 rails vs ruby​​ 有什么了。正如我所说,这个答案还依赖于积极的支持方法。
        • group_by 是红宝石 Enumerable 不是 ActiveSupport
        • 谢谢......就像我说的,我无法跟踪,但很高兴知道。
        【解决方案4】:
        ages.each_with_object({}) do |(str,x),h|
          (h[x] ||= []) << str
        end
          #=> {20=>["alpha", "delta"], 21=>["beta"], 23=>["charlie", "gamma"]}
        

        h[x] ||= [] 扩展为

        h[x] = h[x] || []
        

        如果h 没有密钥x,则变为

        h[x] = nil || []
        

        导致h[x] 被设置为等于一个空数组,然后执行h[x] &lt;&lt; str

        将块变量表示为|(str,x),h| 使用了Ruby 的array decomposition

        enum = ages.each_with_object({})
          #=> #<Enumerator: [["alpha", 20], ["beta", 21], ["charlie", 23],
          #     ["delta", 20], ["gamma", 23]]:each_with_object({})> 
        (str,x),h = enum.next
          #=> [["alpha", 20], {}] 
        str
          #=> "alpha" 
        x #=> 20 
        h #=> {} 
        (h[x] ||= []) << str
          #=> ["alpha"] 
        
        (str,x),h = enum.next
          #=> [["beta", 21], {20=>["alpha"]}] 
        

        等等。

        【讨论】:

        • h[x]= [*h[x],str] 怎么样 :)。我知道它会产生一堆废弃的数组,看起来很有趣
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-11
        • 2021-10-16
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        • 2017-07-06
        相关资源
        最近更新 更多