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

clojure:给定一个映射列表,获取特定键值的总和,clojure,Clojure,输入:[{:a“ID1”:b2}{:a“ID2”:b4}] 我只想将所有键:b相加,并生成以下结果: 结果:6 我想做一个过滤器?把所有的数字拉到向量中,然后把它们加起来,但这看起来像是做了两次工作。我不能在这里使用与+合并,因为:a中有一个字符串。我是否在这里使用了一个reduce功能来拉动相应的键 (减少(fn[x](+(x:b)))0地图列表) 如果我能用更新后的值({:a“ID1”:b6})保留map结构就更好了,但是因为我不需要其他键,所以只需要求和就可以了 我只想将所有键相加:b并生

输入:
[{:a“ID1”:b2}{:a“ID2”:b4}]

我只想将所有键
:b
相加,并生成以下结果:

结果:
6

我想做一个
过滤器?
把所有的数字拉到向量中,然后把它们加起来,但这看起来像是做了两次工作。我不能在这里使用
与+
合并,因为
:a
中有一个字符串。我是否在这里使用了一个
reduce
功能来拉动相应的键

(减少(fn[x](+(x:b)))0地图列表)

如果我能用更新后的值
({:a“ID1”:b6})保留map结构就更好了,但是因为我不需要其他键,所以只需要求和就可以了

我只想将所有键相加: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
将地图的每个条目转换为每个条目上的函数,提取对应于该键的值,从而生成序列:

(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

我对这部分问题的意图有点困惑:

如果我能用更新的值({:a“ID1”:b6})保留映射结构,那就更好了


您想让所有映射中的
:b
的每个值都包含结果中所有值的总和,还是其他内容?

这很简单,但很有效!
(reduce + (map :b list-of-maps))
user=>(+(你的地图:b)(你的地图:b))


是否保证每个映射都包含映射到某个数字的
:b
?为什么不工作
(减少(fn[x](+(x:b)))0映射列表)
@user299709,因为传递到的函数必须有两个参数。@SamEstep啊,因为它是
键值
,在这种情况下,我只使用
[k v]
这不是因为键值。这是因为reduce的第一个参数(0)和map条目都被发送到函数。因此,类似这样的方法将适用于您
(reduce(fn[sum x](+sum(:b x)))0映射列表)
sum将在第一次传递时具有0,并递增直到完成,并在reduce完成时返回。
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