我有一个同类的地图列表,如下所示
({:x 1 :y 2} {:x 3 :y 5} {:x 1 :y 7} {:x 2 :y 0} {:x 3 :y -1})
Run Code Online (Sandbox Code Playgroud)
我想:y用相等的值来对这些对的值求和:x.我的意思是,我想要一个函数y-adder,如果应用于前面的列表给出列表(顺序无关紧要,它可以是一个集合而不是列表)
({:x 1 :y 9} {:x 3 :y 4} {:x 2 :y 0})
Run Code Online (Sandbox Code Playgroud)
我写的是以下内容:
(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))))
Run Code Online (Sandbox Code Playgroud)
它有效,但对于这么简单的任务来说似乎过于复杂.所以我想知道是否有更简单(也许更有效)的解决方案.
对我来说这有点简单,但我没有检查它是否更有效.
> (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})
Run Code Online (Sandbox Code Playgroud)
关键是group-by:
> (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}]}
Run Code Online (Sandbox Code Playgroud)
一旦你拥有它,这是你想要的结果的短途旅行.
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |