ruby 生成所有字母和数字的哈希

cczfrluj  于 2022-12-18  发布在  Ruby
关注(0)|答案(5)|浏览(163)

使用ruby,如何对字母表中的每个字母(键)和1-26(值)进行散列?

我需要创建一个键为“a”到“z”、值为1到26的散列,但我不想将自己写成alphabet = {'a'=>1,'b'=>2,....'y'=>25,'z'=>26}
我需要在代码中使用它来打印alphabet[i] if alphabet.key?(i)

yhxst69z

yhxst69z1#

具有两个范围:zipto_h

('a'..'z').zip(1..26).to_h
kqlmhetl

kqlmhetl2#

('a'..'z').each.with_index(1).to_h
#=> {"a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5, "f"=>6, "g"=>7, "h"=>8, "i"=>9, "j"=>10, 
#    "k"=>11, "l"=>12, "m"=>13, "n"=>14, "o"=>15, "p"=>16, "q"=>17, "r"=>18, "s"=>19, 
#    "t"=>20, "u"=>21, "v"=>22, "w"=>23, "x"=>24, "y"=>25, "z"=>26}

步骤:

  • ('a'..'z')-创建一个由字母“a”到“z”(包括a和z)组成的Range
  • each-返回一个Enumerator
  • with_index(1)-返回初始范围中每个元素的Enumerator及其索引(从1开始),例如[["a",1],["b",2],...]
  • to_h-将Enumerator转换为Hash
    更新

有点深奥,但这也将工作

enum = Enumerator.produce('a') {|e| e == 'z' ? raise(StopIteration) : e.succ }.tap do |e| 
  e.define_singleton_method(:[]) {|elem| find_index(elem)&.+(1) } 
  e.define_singleton_method(:to_h) { with_index(1).to_h }
end
enum['w']
#=> 23
enum['W']
#=> nil 
enum.to_h 
#=> {"a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5, "f"=>6, "g"=>7, "h"=>8, "i"=>9, "j"=>10, 
#    "k"=>11, "l"=>12, "m"=>13, "n"=>14, "o"=>15, "p"=>16, "q"=>17, "r"=>18, "s"=>19, 
#    "t"=>20, "u"=>21, "v"=>22, "w"=>23, "x"=>24, "y"=>25, "z"=>26}
gab6jxml

gab6jxml3#

Hash[('a'..'z').zip(1.upto(26))]
zdwk9cvp

zdwk9cvp4#

根据需要,您可以通过使用带有默认proc的空散列来保存内存。

h = Hash.new do |_h,k|
  k.is_a?(String) && k.match?(/\A[a-z]\z/) ? (k.ord - 96) : nil
end
  #=> {}
h['a']    #=>  1
h['z']    #=> 26 
h['R']    #=> nil
h['cat']  #=> nil
h[2]      #=> nil
h[{a:1}]  #=> nil

请参见Hash::new和字符串#match?。
正则表达式的内容为:“匹配字符串的开头(\A),后跟一个小写字母([a-z]),再后跟字符串的结尾(\z)。[a-z]表示 * 字符类 *。
如果所有小写字母必须组成散列的键,则可以编写如下。

('a'..'z').to_h { |c| [c, c.ord - 96] }
  #=> {"a"=>1, "b"=>2,..., "y"=>25, "z"=>26}


参见可枚举#to_h。

sc4hvdpw

sc4hvdpw5#

已经有更好的答案了,但是这里有一个完全不同的选择,使用times循环,简单地增加使用next的初始哈希的键和值:

h = {"a" => 1}
25.times {h[h.keys.last.next] = h.values.last.next}
h 
#=>  {"a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5, "f"=>6, "g"=>7, "h"=>8, "i"=>9, "j"=>10, "k"=>11, "l"=>12, "m"=>13, "n"=>14, "o"=>15, "p"=>16, "q"=>17, "r"=>18, "s"=>19, "t"=>20, "u"=>21, "v"=>22, "w"=>23, "x"=>24, "y"=>25, "z"=>26}

相关问题