clojure:给定一个地图列表,获取特定键值的总和值

时间:2016-05-21 23:24:50

标签: clojure

输入:[{:a "ID1" :b 2} {:a "ID2" :b 4}]

我想只添加所有键:b并生成以下内容:

结果:6

我考虑过做一个filter?将所有数字拉到矢量中并将其全部添加起来,但这似乎是两次工作。我不能在merge-with +使用:a,因为reduce中有一个字符串。我是否在这里使用(reduce (fn [x] (+ (x :b))) 0 list-of-maps)函数来提取相应的密钥?

({:a "ID1" :b 6})

如果我能保留具有更新值{{1}}的地图结构会更好,但由于我并不真正需要其他键,所以只需要总和就可以了。

3 个答案:

答案 0 :(得分:4)

  

我想只添加所有键:b并生成以下内容:

     

结果:6

我认为可行的代码是:

(def m1 {:a 1, :b 2})
(def m2 {:a 11, :b 12})
(def m3 {:a 21, :b 22})
(def ms [m1 m2 m3])

(->> ms
     (map :b)
     (reduce +))

我觉得在这里使用->>可以帮助您处理可读性。

这表示对ms采取行动,:b被定义为地图矢量,threading通过其余表格增加结果。

第一件事是使用关键字(2 12 22) 作为函数对每个地图条目进行转换,从而获取与该键对应的值,从而生成序列:

reduce

然后,您可以完全按照直觉穿过该seq来应用user=> (def m1 {:a 1, :b 2}) #'user/m1 user=> (def m2 {:a 11, :b 12}) #'user/m2 user=> (def m3 {:a 21, :b 22}) #'user/m3 user=> (def ms [m1 m2 m3]) #'user/ms user=> (->> ms #_=> (map :b) #_=> (reduce +)) 36 以获得结果:

:b

我对这部分问题的意图感到困惑:

  

如果我能保留具有更新值的地图结构({:a" ID1":b 6}),那就更好了。

您是否希望所有地图中的Set的每个值都包含结果中的所有值或其他内容?

答案 1 :(得分:1)

(reduce + (map :b list-of-maps))

答案 2 :(得分:0)

这很简单但有效!     用户=> (+(你的地图:b)(你的地图:b))

user=> (def x [{:a "ID1" :b 2} {:a "ID2" :b 4}])
#'user/x
user=> (+ ((first x) :b) ((second x) :b))
6
user=>

or user=> (+ ((nth x 0) :b) ((nth x 1) :b))
6