Jul*_*ius 0 ruby sum ruby-hash
我有两个哈希:
first = { 1 => [15, 15, 15, 8], 4 => [11, 12, 7, 7], 5 => [14, 17, 13, 13],
6 => [19, 19, 15, 15], 7 => [5, 12, 12, 12], 8 => [10, 14, 14, 14],
9 => [8, 7, 8, 8] }
second = { 1 => [0, 1, 2], 4 => [2, 3], 5 => [2, 3], 6 => [0, 1, 2, 3],
7 => [1, 2, 3], 8 => [1, 2, 3], 9 => [2, 3] }
Run Code Online (Sandbox Code Playgroud)
如您所见,它们都使用相同的键,但值不同.second的值包含值的索引范围,first我只需要将first那些范围内的值相加.
预期产量:
result = { 1 => [45], 4 => [14], 5 => [26], etc }
Run Code Online (Sandbox Code Playgroud)
一种直截了当的方式就是准确地说出你的意思:
first.map { |k, v| [ k, [ v.values_at(*second[k]).sum ] ] }.to_h
Run Code Online (Sandbox Code Playgroud)
如果您的Ruby版本没有,Array#sum那么使用inject(:+):
first.map { |k, v| [ k, [ v.values_at(*second[k]).inject(:+) ] ] }.to_h
Run Code Online (Sandbox Code Playgroud)
您也可以使用以下方式跳过map/ to_hbusiness each_with_object:
first.each_with_object({}) { |(k, v), h| h[k] = [ v.values_at(*second[k]).inject(:+) ] }
Run Code Online (Sandbox Code Playgroud)
与Array#values_at文档一样,Enumerable文档的一点时间可能会很有成效.
| 归档时间: |
|
| 查看次数: |
780 次 |
| 最近记录: |