从一个键数组创建哈希表

36

我已经查看了stackoverflow上的其他问题,但没有找到针对我的特定问题的答案。

我有一个数组:

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

我想将这个数组转换为一个哈希表,其中数组元素成为哈希表中的键,它们的值都是相同的,比如都是1。也就是说,哈希表应该是:

{"a" => 1, "b" => 1, "c" => 1, "d" => 1}
10个回答

72

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

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

29

有几种选择:

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}
    

    5
    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}
    

    3

    在这里:

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

    这里假设根据您上面的例子,a = ['a', 'b', 'c', 'd'],并且value = 1

    1
    你不需要使用 flattenHash[] 可以接受一个数组的数组。 - mu is too short
    Hash[]不幸的是不能接受一个数组的数组: Hash[[1, 2], [3, 4]] => {[1, 2]=>[3, 4]} - Asfand Qazi
    @AsfandYarQazi:那就这么做吧:Hash[ *[[1, 2], [3, 4]].flatten ] - Linuxios

    3
    ["a", "b", "c", "d"].inject({}) do |hash, elem|
      hash[elem] = 1
      hash
    end
    

    2
    在这里,each_with_object更合适。 - mu is too short
    @muistooshort,这肯定会有用,但我在编程时没有经常使用它,所以没想起来。谢谢!:) - Andrew Marshall
    我经常使用它,因为块中的额外返回值看起来很孤单 :) - mu is too short
    @muistooshort 更重要的是,我总是忘记它,然后在第一次出现 :P 时得到 undefined method []= - Andrew Marshall

    1

    如果你的项目包括Rails 6或更高版本(或者你愿意导入 ActiveSupport),那么你可以使用 Enumerable#index_with:

    %i[a b c].index_with { 0 }
    
    # => {a: 0, b: 0, c: 0}
    

    你可以选择将数组元素传递到块中:

    %w[a b c].index_with { |x| x.upcase }
    
    # => {"a" => "A", "b" => "B", "c" => "C"}
    

    0
    a = ["a", "b", "c", "d"]
    h = a.inject({}){|h,k| h[k] = 1; h}
    #=> {"a"=>1, "b"=>1, "c"=>1, "d"=>1}
    

    0
    {}.tap{|h| %w(a b c d).each{|x| h[x] = 1}}
    

    0
    a = ['1','2','33','20']
    
    Hash[a.flatten.map{|v| [v,0]}.reverse]
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接