#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
опции, но для ввода потребовалось больше букв, чем для моей первоначальной, поэтому я отказался от нее 🙂