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

use*_*709 3 clojure

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

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

结果: 6

我想过filter?将所有数字拉入向量并将其全部加起来,但这似乎做了两次工作。我不能merge-with +在这里使用,因为里面:a有一个字符串。我是否使用reduce带有可拉出适当键的函数的here ?

(reduce (fn [x] (+ (x :b))) 0 list-of-maps)

如果我可以保留具有更新值的地图结构会更好,({:a "ID1" :b 6})但由于我真的不需要其他键,所以总和就可以了。

Del*_*Del 5

我只想将所有键相加 :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 +))
Run Code Online (Sandbox Code Playgroud)

我觉得使用->>here 可以帮助您提高可读性。

这表示对 采取行动ms,它被定义为一个映射向量,通过剩余的形式将增量结果线程化

第一件事是使用关键字:b作为每个条目的函数转换映射的每个条目,提取与该键对应的值,从而产生序列:

(2 12 22)
Run Code Online (Sandbox Code Playgroud)

然后,您可以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
Run Code Online (Sandbox Code Playgroud)

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

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

你想让:b所有地图的每个值都包含在结果中的所有值的总和,还是其他什么?

  • 这不是因为键值。这是因为 reduce 的第一个参数(0)和映射条目都被发送到函数。所以这样的事情对你有用`(reduce (fn [sum x] (+ sum (:bx))) 0 list-of-maps)` Sum将在第一次被传递时为0并递增直到完成和减少完成时返回。 (3认同)