0

我在 ruby​​ 中有这样的数组(文档语言 [偶数索引] 和单词数 [奇数索引])

words = ["en",200,"ru","120","es",140,"ru",240]

最终结果应如下所示:

{"en"=>200,"ru=>360","es"=>140}
4

4 回答 4

6

啊,你需要对重复的键求和。所以,这个Hash::[]方法在这里行不通。没问题,使用each_slice+each_with_object然后:

words = ["en",200,"ru","120","es",140,"ru",240]

hash = words.each_slice(2).each_with_object({}) do |(k, v), memo|
  memo[k] ||= 0
  memo[k] += v.to_i
end

hash # => {"en"=>200, "ru"=>360, "es"=>140}
于 2013-01-22T08:10:07.620 回答
1

您可以使用each_sliceandinject首先将数组分割成块,然后添加值。

这个版本大致相当于 Sergio Tulentsev 的版本,但要短一些(在 Ruby 1.8 中工作)。

hash = words.each_slice(2).inject(Hash.new(0)) do |hash, (k, v)|
  hash[k] += v.to_i
  hash
end

请注意,我使用默认值 0 初始化哈希。Sergio 也可以这样做,因此他的版本如下所示:

hash = words.each_slice(2).each_with_object(Hash.new(0)) do |(k, v), memo|
  memo[k] += v.to_i
end

请注意,each_with_objectSergio 使用的方法是在 Ruby 1.9 中引入的,因此在较旧的 Ruby 版本中不可用,但这可能不是问题。

于 2013-01-22T11:58:49.370 回答
0
words = ['en', 200, 'ru', 120, 'es', 140, 'ru', 240]

words.
 each_slice(2).
 each_with_object(Hash.new(0)) {|(lang, wordcount), acc| acc[lang] += wordcount }
于 2013-01-22T12:15:42.190 回答
-1
words = ["en",200,"ru","120","es",140,"ru",240]

h1 = Hash[*words.flatten]
于 2013-01-22T08:13:59.090 回答