У меня есть однородный список карт, например:
({:x 1 :y 2} {:x 3 :y 5} {:x 1 :y 7} {:x 2 :y 0} {:x 3 :y -1})
Я хотел бы суммировать :y
значения пар с равными :x
значениями.Я имею в виду, я хочу функцию y-adder
, которая при применении к предыдущему списку дает список (порядок не имеет значения, это может быть набор вместо списка)
({:x 1 :y 9} {:x 3 :y 4} {:x 2 :y 0})
То, что я написалвыглядит следующим образом:
(defn y-adder [Ps]
(let [xs (set (map :x Ps))]
(let [y+ (fn [v] (apply + (map :y (filter #(= (:x %) v) Ps))))]
(map #(hash-map :x % :y (y+ %)) xs))))
Это работает, но кажется слишком сложным для такой простой задачи.Поэтому мне интересно, есть ли более простое (и, возможно, более эффективное) решение.