输入:[{:a "ID1":b 2} {:a "ID2":b 4}]
我只想将所有键 :b
相加并生成以下内容:
结果:6
我想过做一个过滤器?
将所有数字拉入向量并将其全部相加,但这似乎需要做两次工作。我不能在这里使用 merge-with +
因为 :a
中有一个字符串。我是否在此处使用 reduce
以及将提取相应 key 的函数?
(reduce (fn [x] (+ (x :b))) 0 map 列表)
如果我可以保留具有更新值的 map 结构,那就更好了 ({:a "ID1":b 6})
但因为我真的不需要其他键,只需总和就可以了。
最佳答案
I want to only add up all the keys :b and produce the following:
Result: 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
采取行动,它被定义为 map 向量 threading通过其余形式获得增量结果。
第一件事是使用关键字 :b
作为每个映射的函数来转换映射的每个条目,提取与该键对应的值,从而产生序列:
(2 12 22)
然后,您可以完全按照您在该序列中的直觉应用reduce
来获得结果:
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
<小时/>
我对你这部分问题的意图有点困惑:
It would be even nicer if I could retain the map structure with updated value ({:a "ID1" :b 6})
您是否希望所有映射中的 :b
的每个值都包含在结果或其他内容中所有值的总和?
关于clojure:给定一个映射列表,获取特定键值的总和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37369012/