Clojure:汇总地图集合中的值

时间:2011-10-28 10:10:50

标签: collections clojure maps sum reduce

我试图通过公共密钥来汇总地图集合的值。我有这个片段:

(def data [{:a 1 :b 2 :c 3} {:a 1 :b 2 :c 3}]
(for [xs data] (map xs [:a :b]))
((1 2) (1 2))

Final result should be ==> (2 4)

基本上,我有一张地图清单。然后我执行一个理解列表,只取我需要的键。

我现在的问题是,我现在如何总结这些价值观?我尝试使用“reduce”,但它仅适用于序列,而不是集合。

感谢。

=== EDIT ====

使用Joost的建议我得出了这个:

(apply merge-with + (for [x data] (select-keys x [:col0 :col1 :col2]))

这会迭代一个集合并对所选键进行求和。我添加的“选择键”部分尤其需要避免在集合中的地图包含文字而不仅仅是数字时遇到麻烦。

1 个答案:

答案 0 :(得分:11)

如果你真的想要对公共密钥的值求和,你可以一步完成整个转换:

(apply merge-with + data)
=> {:a 2, :b 4, :c 6}

总结您拥有的子序列:

(apply map + '((1 2) (1 2)))
=> (2 4)