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

标签 clojure

输入:[{: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/

相关文章:

macros - 从函数构建高阶函数的 Clojure 宏

animation - 如何使用 core.async 防止动画重叠?

string - 如何检索作为 Clojure 中的列表的 HashMap 中的键的值?

functional-programming - Clojure 与哪些函数式语言最相似?

clojure - 如何减少下面 Clojure 代码中的重复?

clojure - Clojure 中符号和变量的区别

mysql - 从 cascalog 写入 MySQL 不起作用。如何调试这个?

error-handling - 如何访问:cause, :via and :trace keys of an exception in Clojure?

clojure - 在 Clojure 中将字符串转换为日期

clojure - 如何在 Clojure 中进行求幂?