2013-10-03 124 views
2

我在ruby中有一個關聯數組,我想將其轉換爲哈希。這個散列將代表第一個值作爲鍵值,並將第二個值的總和表示爲它的值。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> 
} 

回答

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} 
+0

謝謝您的回答!我重寫了這個更紅寶石優雅的方式,x.inject(Hash.new(0)){| h,e | h [e [0]] + = e [1]; h} – Atul

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} 
+0

如果他有100個鍵,他需要100行。不是一般的答案。 – hirolau

+0

@hirolau嗯,所以我也加了一個新的.. :) –

2

一個簡單的方法減少。 它從一個空的哈希開始,遍歷所有x的元素。 對於每一對都將其值添加到散列元素key(如果此索引之前未設置,則默認爲0)。最後一行爲下一次迭代設置內存變量hash

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

編輯:在初始化

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}