-2

我想像这样创建一个哈希(字典)dic = {2 => "ABC", 3 => "DEF"}:。在 python 中,代码如下所示:

text = "abcdef"  

for letter in text.lower():
    for group, number in dic.items(): 
        if letter in group:

对于 text de code 中的每个字母,在字典中查找相同的字母。我怎样才能在红宝石中做到这一点?有任何想法吗?

4

3 回答 3

2

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

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}

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

于 2013-06-01T04:24:57.520 回答
0
test = "abcdef"
dic = {2 => "ABC", 3 => "DEF"}
test.each_char { |s|
    dic.each { |key, val|
        puts key if val.include?(s.upcase)          
    }
}

是你的意思吗?

于 2013-06-01T04:41:26.270 回答
0
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如果未找到匹配值,则搜索返回。

于 2013-06-01T05:11:52.860 回答