2

我在 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

4 回答 4

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}
于 2013-10-03T19:37:34.490 回答
2

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

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

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

于 2013-10-03T19:43:58.983 回答
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}
于 2013-10-03T19:39:43.577 回答
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}
于 2013-10-03T19:45:16.437 回答