Ruby关联数组计算

时间:2013-10-03 19:29:42

标签: ruby arrays ruby-on-rails-3 hash

我在ruby中有一个关联数组,我想将其转换为哈希。此哈希将第一个值表示为键,将第二个值的总和表示为其值。

 x =   [[1,2],[1,3],[0,1],[0,2],[0,3],[1,5],[0,4],[1,6],[0,9],[1,9]]

如何从此关联数组中获取如下的哈希值?

{
  :0 => <sum_of_second_values_with_0_as_first_values>,
  :1 => <sum_of_second_values_with_1_as_first_values>
}

4 个答案:

答案 0 :(得分:3)

它不是很漂亮但它有效。

x =   [[1,2],[1,3],[0,1],[0,2],[0,3],[1,5],[0,4],[1,6],[0,9],[1,9]]

p Hash[
   x.group_by(&:first)
   .map do |key, val|
     [key,val.map(&:last).inject(:+)]
   end
] # => {1=>25, 0=>19}

第二个想法,这更简单:

result = Hash.new(0)
x.each{|item| result[item.first] += item.last}
p result # => {1=>25, 0=>19}

答案 1 :(得分:2)

使用reduce的简单解决方案。 它以空Hash开头,并遍历x的所有元素。 对于每对,它将其值添加到key处的哈希元素(如果之前未设置此索引,则默认值为0)。最后一行为下一次迭代设置内存变量hash

x.reduce(Hash.new(0)) { |hash, pair|
    key, value = pair
    hash[key] += value
    hash
}

编辑:在初始化时设置哈希默认值

答案 2 :(得分:1)

x = [[1,2],[1,3],[0,1],[0,2],[0,3],[1,5],[0,4],[1,6],[0,9],[1,9]]
arr_0,arr_1 = x.partition{|a,b| a==0 }
Hash[0,arr_0.map(&:last).inject(:+),1,arr_1.map(&:last).inject(:+)]
# => {0=>19, 1=>25}

x =   [[1,2],[1,3],[0,1],[0,2],[0,3],[1,5],[0,4],[1,6],[0,9],[1,9]]
hsh = x.group_by{|a| a.first}.each_with_object(Hash.new(0)) do |(k,v),h|
    h[k]=v.map(&:last).inject(:+)
end
hsh
# => {1=>25, 0=>19}

答案 3 :(得分:1)

each_with_object也有效

[[1,2],[1,3],[0,1],[0,2],[0,3],[1,5],[0,4],[1,6],[0,9],[1,9]].
each_with_object(Hash.new(0)) {|(first,last), h| h[first] += last }
# => {1=>25, 0=>19}