我是Ruby的新手(通常是编码人员),尝试将数组转换为哈希,其中键为单词,值为单词在数组中出现的次数(例如“ banana” => 1,“芒果” => 2等)。
我正在尝试使用each_with_object这样做,因为它应该可以从数组中构建新哈希。
array = %w(banana pear mango kiwi mango)
hash1 = array.each_with_object(Hash.new(0)) do |word, count|
hash1[word] = count
count += 1
return hash1
end
puts hash1
但是代码根本不起作用。有人可以向我解释为什么不这样做以及我应该改变什么吗?
谢谢!
答案 0 :(得分:3)
要使代码正常工作,您需要修复使用each_with_object
的方式。
array = %w(banana pear mango kiwi mango)
hash1 = array.each_with_object(Hash.new(0)) do |word, counts|
counts[word] += 1
end
puts hash1
Hash.new(0)
是一个哈希,在读取未知密钥时返回零。因此,您在这里要做的是通过迭代array
并将每个键的计数增加一个来填充它。
我建议阅读更多有关reduce和each_with_object的内容,以了解其用法。
Fabio的答案是比较惯用的答案,但我只是想展示如何修复代码而不是重写代码。
答案 1 :(得分:1)
使用最新的红宝石(itself
和transform_values
方法),您可以执行以下操作:
%w(word one two word).group_by(&:itself).transform_values(&:length)
# => {"word"=>2, "one"=>1, "two"=>1}
哪里
.group_by(&:itself)
# returns => {"word"=>["word", "word"], "one"=>["one"], "two"=>["two"]}
.transform_values(&:length)
# returns => {"word"=>2, "one"=>1, "two"=>1}
答案 2 :(得分:1)
不知道它是否有效,但是它的替代方法
%w[banana pear mango kiwi mango].group_by{|x| x}.map{|key, values| [key, values.length]}.to_h
答案 3 :(得分:0)
虽然您可以按照上面的说明修复代码,但我还是喜欢提供这种替代方法:
array.zip.group_by(&:first).transform_values(&:size)
#=> {"banana"=>1, "pear"=>1, "mango"=>2, "kiwi"=>1}