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