【问题标题】:How to "zip" two arrays into hash如何将两个数组“压缩”成哈希
【发布时间】:2014-05-31 13:56:19
【问题描述】:

我想将两个数组“压缩”成一个哈希。

发件人:

['BO','BR']
['BOLIVIA','BRAZIL']

收件人:

{BO: 'BOLIVIA', BR:'BRAZIL'}

我该怎么做?

【问题讨论】:

  • 您生成的哈希值不是有效的语法。你的意思是{'BO': 'BOLIVIA', 'BR':'BRAZIL'}
  • @lurker:生成的哈希 is 语法有效,而你的则无效。在新样式的散列文字中,键必须是 Symbols,它们是有效的 Ruby 标识符。 'BO' 不是合法标识符(标识符中不允许使用撇号)。
  • 两者实际上都是有效的语法,但如果我“压缩”两个数组,我希望结果与源匹配。

标签: ruby arrays hashmap


【解决方案1】:

我会这样做:

keys = ['BO','BR']
values = ['BOLIVIA','BRAZIL']

Hash[keys.zip(values)]
# => {"BO"=>"BOLIVIA", "BR"=>"BRAZIL"}

如果你想要键的符号,那么:

Hash[keys.map(&:to_sym).zip(values)]
# => {:BO=>"BOLIVIA", :BR=>"BRAZIL"}

在 Ruby 2.1.0 或更高版本中,您可以这样写:

keys.zip(values).to_h
keys.map(&:to_sym).zip(values).to_h

从 Ruby 2.5 开始,您可以使用 .transform_keys

Hash[keys.zip(values)].transform_keys { |k| k.to_sym }

【讨论】:

  • Biig +1 为to_h。我还没有使用 2.1.0,但 to_h 终于可以将数组对转换为哈希值了。 Hash#[] 方法真的很笨拙,没有那种 Ruby 做事的感觉。
  • 您现在可以使用transform_keys(&:to_sym) 转换为符号键。
【解决方案2】:

您可以创建一个压缩数组,然后将数组转换为哈希,如下所示:

keys = ['BO','BR']
values = ['BOLIVIA','BRAZIL']    
array = key.zip(values) # => [['BO','BOLIVIA'],['BR','BRAZIL']]
hash = array.to_h # => {'BO' => 'BOLIVIA','BR' => 'BRAZIL'}

【讨论】:

    【解决方案3】:

    只需使用二元组中的单个Array,然后转置,生成Hash

    keys = ['BO','BR']
    values = ['BOLIVIA','BRAZIL']
    Hash[[keys,values].transpose]
    # => {"BO"=>"BOLIVIA", "BR"=>"BRAZIL"}
    

    或者对于较新的 ruby​​ 版本:

    [keys,values].transpose.to_h
    

    【讨论】:

    • 有理由更喜欢[keys, values].transpose 而不是keys.zip(values)
    • 出于兴趣,为什么这被否决了?对我来说似乎是一种有效的方法,对于较大的列表它可能运行缓慢,但工作正常。
    • @toro2k 即图形化 =)
    【解决方案4】:

    具有讽刺意味的是,如果您只是在问题中添加一些点和下划线,它就可以工作:

    我想在to_hash 中“zip”两个数组

    ary1.zip(ary2).to_h
    # => { 'BO' => 'BOLIVIA', 'BR' => 'BRAZIL' }
    

    实际上,您在输出哈希中指定键应该是Symbols 而不是Strings,所以我们需要先转换它们:

    ary1.map(&:to_sym).zip(ary2).to_h
    # => { BO: 'BOLIVIA', BR: 'BRAZIL' }
    

    【讨论】:

      【解决方案5】:

      相当易读的版本是:

      keys = ['BO','BR']
      values = ['BOLIVIA','BRAZIL']
      
      keys.zip(values).each_with_object({}) do |(key, value), hash|
        hash[key.to_sym] = value
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-24
        • 2021-11-24
        • 2017-09-26
        • 2017-11-06
        • 2014-09-26
        • 2016-07-16
        • 1970-01-01
        相关资源
        最近更新 更多