数组到哈希红宝石

时间:2013-01-22 08:08:17

标签: ruby arrays hash

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

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

最终结果应如下所示:

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

4 个答案:

答案 0 :(得分: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}

答案 1 :(得分:1)

您可以使用each_sliceinject首先将数组切片为块,然后添加值。

这个版本大致相当于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

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

答案 2 :(得分: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 }

答案 3 :(得分:-1)

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

h1 = Hash[*words.flatten]