Ruby. Получаем среднее значение массива, ЕСЛИ даты равны

#ruby #arrays #sorting

#ruby #массивы #сортировка

Вопрос:

У меня есть массив массивов

 [
 [3, "2014-06-28"], 
 [3, "2014-06-29"], 
 [3, "2014-06-30"], 
 [27, "2014-07-02"], 
 [7, "2014-07-02"]
]
  

Если даты равны, я хочу получить среднее значение их значений, чтобы приведенный выше массив стал

 [
 [3, "2014-06-28"], 
 [3, "2014-06-29"], 
 [3, "2014-06-30"], 
 [17, "2014-07-02"], 
]
  

Массив уже отсортирован по дате.

Как бы я поступил по этому поводу? Использую ли я рекурсивную функцию?

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

1. хорошо, вы хотите среднее значение второго столбца, где даты одинаковы? верно?

2. А как насчет первого столбца? Должно ли оно быть тоже средним?

3. Я отредактировал вопрос для ясности

4. Отсортирован ли ваш массив по дате по умолчанию? 🙂

5. да, он отсортирован по дате

Ответ №1:

 arr = [
        [3, "2014-06-28"], 
        [3, "2014-06-29"], 
        [3, "2014-06-30"], 
        [27, "2014-07-02"], 
        [7, "2014-07-02"]
      ]

arr.group_by(amp;:last).map do |k, vs|
  av = vs.map(amp;:first).inject(: ) / vs.size.to_f
  [av, k]
end

#=> [
#=>   [3.0, "2014-06-28"], 
#=>   [3.0, "2014-06-29"], 
#=>   [3.0, "2014-06-30"], 
#=>   [17.0, "2014-07-02"]
#=> ]
  

Если вы ищете более оптимизированное, но менее идиоматичное решение (и ваш набор данных упорядочен по дате), вы могли бы следовать этому:

 arr = [
        [3, "2014-06-28"], 
        [3, "2014-06-29"], 
        [3, "2014-06-30"], 
        [27, "2014-07-02"], 
        [7, "2014-07-02"]
      ]

res = []
tmp = [0]
cnt = 0
arr.each do |num, date|
  if tmp[1] amp;amp; tmp[1] != date
    tmp[0] /= cnt.to_f
    res << tmp
    tmp = [0]
    cnt = 0
  end
  tmp[0]  = num
  tmp[1] = date
  cnt  = 1
end
tmp[0] /= cnt.to_f
res << tmp
res

#=> [
#=>   [3.0, "2014-06-28"], 
#=>   [3.0, "2014-06-29"], 
#=>   [3.0, "2014-06-30"], 
#=>   [17.0, "2014-07-02"]
#=> ]
  

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

1. Если бы у меня было дополнительное значение в каждом массиве, скажем, например [1400496920000, 2, "2014-05-19"] . Как бы мне отредактировать ваш второй пример, чтобы усреднить второе значение в массиве?

2. Каким должен быть результат? Массив массивов из двух элементов или трех элементов?