改进clojure函数

改进clojure函数,clojure,Clojure,我有一个同质地图列表,如下所示 ({:x 1 :y 2} {:x 3 :y 5} {:x 1 :y 7} {:x 2 :y 0} {:x 3 :y -1}) 我想用相等的:x值对这些对的:y值求和。我的意思是,我想要一个函数y-adder,如果应用于前面的列表,就可以得到列表(顺序无关紧要,它可以是一个集合,而不是一个列表) 我写的是: (defn y-adder [Ps] (let [xs (set (map :x Ps))] (let [y+ (fn [v] (apply + (

我有一个同质地图列表,如下所示

({:x 1 :y 2} {:x 3 :y 5} {:x 1 :y 7} {:x 2 :y 0} {:x 3 :y -1})
我想用相等的
:x
值对这些对的
:y
值求和。我的意思是,我想要一个函数
y-adder
,如果应用于前面的列表,就可以得到列表(顺序无关紧要,它可以是一个集合,而不是一个列表)

我写的是:

(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))))

它可以工作,但对于这样一个简单的任务来说似乎过于复杂了。所以我想知道是否有一个更简单(也许更有效)的解决方案。

对我来说这有点简单,但我还没有检查它是否更有效

> (for [[k v] (group-by :x xs)] {:x k :y (apply + (map :y v))})
({:x 1, :y 9} {:x 3, :y 4} {:x 2, :y 0})
键是
分组依据

> (group-by :x xs)
{1 [{:x 1, :y 2} {:x 1, :y 7}],
 3 [{:x 3, :y 5} {:x 3, :y -1}],
 2 [{:x 2, :y 0}]}
(defn y-adder [ps]
  (map (fn [[x-val matches]]
         {:x x-val :y (apply + (map :y matches))})
       (group-by :x ps)))

一旦你有了这些,你就可以很快达到你想要的结果。

你可以使用
分组方式

> (group-by :x xs)
{1 [{:x 1, :y 2} {:x 1, :y 7}],
 3 [{:x 3, :y 5} {:x 3, :y -1}],
 2 [{:x 2, :y 0}]}
(defn y-adder [ps]
  (map (fn [[x-val matches]]
         {:x x-val :y (apply + (map :y matches))})
       (group-by :x ps)))

而不是映射,然后应用,考虑<代码>(换能器(map:y)+ 0 V)< /代码>