使用ruby,如何对字母表中的每个字母(键)和1-26(值)进行散列?
我需要创建一个键为“a”到“z”、值为1到26的散列,但我不想将自己写成alphabet = {'a'=>1,'b'=>2,....'y'=>25,'z'=>26}我需要在代码中使用它来打印alphabet[i] if alphabet.key?(i)
alphabet = {'a'=>1,'b'=>2,....'y'=>25,'z'=>26}
alphabet[i] if alphabet.key?(i)
yhxst69z1#
具有两个范围:zip和to_h
zip
to_h
('a'..'z').zip(1..26).to_h
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')
Range
each
Enumerator
with_index(1)
[["a",1],["b",2],...]
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}
gab6jxml3#
Hash[('a'..'z').zip(1.upto(26))]
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
[a-z]
\z
('a'..'z').to_h { |c| [c, c.ord - 96] } #=> {"a"=>1, "b"=>2,..., "y"=>25, "z"=>26}
型参见可枚举#to_h。
sc4hvdpw5#
已经有更好的答案了,但是这里有一个完全不同的选择,使用times循环,简单地增加使用next的初始哈希的键和值:
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}
5条答案
按热度按时间yhxst69z1#
具有两个范围:
zip
和to_h
kqlmhetl2#
步骤:
('a'..'z')
-创建一个由字母“a”到“z”(包括a和z)组成的Range
each
-返回一个Enumerator
with_index(1)
-返回初始范围中每个元素的Enumerator
及其索引(从1开始),例如[["a",1],["b",2],...]
to_h
-将Enumerator
转换为Hash
更新:
有点深奥,但这也将工作
gab6jxml3#
zdwk9cvp4#
根据需要,您可以通过使用带有默认proc的空散列来保存内存。
请参见Hash::new和字符串#match?。
正则表达式的内容为:“匹配字符串的开头(
\A
),后跟一个小写字母([a-z]
),再后跟字符串的结尾(\z
)。[a-z]
表示 * 字符类 *。如果所有小写字母必须组成散列的键,则可以编写如下。
型
参见可枚举#to_h。
sc4hvdpw5#
已经有更好的答案了,但是这里有一个完全不同的选择,使用
times
循环,简单地增加使用next
的初始哈希的键和值: