为了账号安全,请及时绑定邮箱和手机立即绑定

使用散列,

使用散列,

哈士奇WWW 2021-03-17 14:14:20
我想创建一个散列(字典)就像这样:dic = {2 => "ABC", 3 => "DEF"}。在python中,代码如下所示:text = "abcdef"  for letter in text.lower():    for group, number in dic.items():         if letter in group:对于文本中的每个字母,代码会在字典中查找相同的字母。如何在红宝石中做到这一点?有任何想法吗?
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

这是您的代码的直接翻译(顺便说一句,它与您的描述不匹配):


hash = {

  "abc" => 1,

  "def" => 2,

}


str = "abcdef"


str.downcase.each_char do |char|

  hash.each_pair do |key, val|

    puts val if key.include?(char)

  end

end



--output:--

1

1

1

2

2

2

但是,这就是O(n ^ 2),这意味着效率低下。您可能最好构造一个更好的哈希值:


hash = {

  "abc" => 1,

  "def" => 2,

}


new_hash = {}


hash.each_pair do |key, val|

  key.each_char do |char|

    new_hash[char] = val

  end

end


p new_hash


--output:--

{"a"=>1, "b"=>1, "c"=>1, "d"=>2, "e"=>2, "f"=>2}

使用该代码,您遍历散列一次即可创建新的散列,并且后续的散列查找非常有效。使用原始代码,您可以遍历字符串中每个字母的整个哈希值。


查看完整回答
反对 回复 2021-03-29
?
白板的微信

TA贡献1883条经验 获得超3个赞

test = "abcdef"

dic = {2 => "ABC", 3 => "DEF"}

test.each_char { |s|

    dic.each { |key, val|

        puts key if val.include?(s.upcase)          

    }

}

是你的意思吗?


查看完整回答
反对 回复 2021-03-29
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

text = "abcdef"

hash = {2 => "ABC", 3 => "DEF"}

text.upcase.each_char do |c|

  puts hash.keys.find{|k| hash[k].include?(c.upcase)}

end

输出:


2个

2个

2个

3

3

3

似乎您想要一个不区分大小写的搜索,因此我同时调用upcase了这两个数据源。如果text保证小写或哈希值保证大写,则可以删除其中之一。与现有答案相比,它的一个好处是它仅进行搜索,直到找到匹配的值为止,我认为这就是您想要的。nil如果找不到匹配的值,则返回搜索。


查看完整回答
反对 回复 2021-03-29
  • 3 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信