Сумма значений в двумерном векторе - PullRequest
0 голосов
/ 10 января 2020

У меня есть 2D-вектор, который выглядит следующим образом

[[1917 2850]
 [1623 34]
 [1917 300]]

Я хочу получить итоговые значения второго значения для всех значений, в которых первое значение совпадает. Таким образом, он даст такой результат

 [[1917 3150]
 [1623 34]]

Как я могу сделать это в Clojure? Я думал, может быть, я мог бы добавить в отсортированный набор, но я не уверен, что это лучше.

Ответы [ 2 ]

1 голос
/ 10 января 2020

Делайте это шаг за шагом:

Используя sort-by + partition-by ...

(->> [[1917 2850]
      [1623 34]
      [1917 300]]
     ;; sort by first element
     (sort-by first)
     ;; split when first element changes
     (partition-by (comp identity first))
     ;; for each partition, take first element of first row
     ;; as key, and sum up second element of each row as value
     (mapv (fn [xs]
             [(ffirst xs)
              (apply + (map second xs))])))
;; => [[1623 34]
;;     [1917 3150]]

... или используйте group-by

(->> [[1917 2850]
      [1623 34]
      [1917 300]]
     ;; group by first element
     (group-by first)
     ;; for each group, take the group key
     ;; and sum up second element of each row in the group
     (mapv (fn [[g xs]]
             [g (apply + (map second xs))])))
1 голос
/ 10 января 2020

Прочтите немного на этих книгах и сайтах:

и Clojure CheatSheet . Я бы начал с group-by:

(ns tst.demo.core
  (:use tupelo.core tupelo.test))

(def data
  [[1917 2850]
   [1623 34]
   [1917 300]] )

(group-by first data) => 
    {1917 [[1917 2850] 
           [1917 300]], 
     1623 [[1623 34]]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...