Как добавить суммы из массива массивов

#arrays #ruby

#массивы #ruby

Вопрос:

У меня есть массив массивов, подобных so…

 a1 = [[9, -1811.4], [8, 959.86], [7, -385], [6, -1731.39], [5, 806.78], [4, 2191.65]]
  

Мне нужно получить среднее значение 2-х элементов (сумм) из общего массива.

Итак, добавьте -1811.4,959.86,-385, -1731.39,806.78, разделенные на количество (6)

Я пробовал…

 a1.inject{ |month, amount| amount }.to_f / a1.size
  

Это неправильно, и я не вижу, что мне нужно делать

Ответ №1:

 a1.map(amp;:last).inject(: ) / a1.size.to_f
#=> 5.0833333333332575
  

Шаги:

 # 1. select last elements
a1.map(amp;:last)
#=> [-1811.4, 959.86, -385, -1731.39, 806.78, 2191.65]
# 2. sum them up
a1.map(amp;:last).inject(: )
#=> 30.499999999999545
# 3. divide by the size of a1
a1.map(amp;:last).inject(: ) / a1.size.to_f
#5.0833333333332575
  

Комментарии:

1. Превращает ли этот метод отрицательные значения в положительные при добавлении?

2. @SupremeA это не так. Он просто суммирует их. Вам нужно суммировать абсолютные значения?

3. да, теперь я вижу, спасибо!

Ответ №2:

Достаточно одного прохода a1 .

 a1.reduce(0) { |tot, (_,b)| tot   b }/a1.size.to_f
  #=> 5.0833333333332575
  

.to_f позволяет a1 содержать только целочисленные значения.

Шаги:

 tot = a1.reduce(0) { |tot, (_,b)| tot   b }
  #=> 30.499999999999545 
n = a1.size.to_f
  #=> 6.0 
tot/n
  #=> 5.0833333333332575 
  

Комментарии:

1. Просто еще один вариант, который мы также можем использовать .fdiv(a1.size) вместо /a1.size.to_f .

2. @sagarpandya82, я никогда не слышал о числовом #fdiv . Спасибо за совет.

3. Также рассматривал возможность добавления inject опции, но для ввода потребовалось больше букв, чем для моей первоначальной, поэтому я отказался от нее 🙂