我正在尝试提出一个功能解决方案来解决由交替集和数值组成的自定义数据结构中的重复项。
一个例子:
(def a [#{:a} 0.1 #{:b} 0.3 #{:a :b} 0.1 #{:a} 0.3 #{:b} 0.1 #{:a} 0.1])
我想添加与重复集对应的值以产生
[#{:a} 0.5 #{:b} 0.4 #{:a :b} 0.1]
我可以使用loop/recur
来做到这一点,但想知道是否有一种方法可以在Clojure中使用高阶函数。
谢谢。
最佳答案
(reduce
(fn [acc [k v]]
(update acc k (fnil + 0) v))
{}
(partition 2 a))
首先,将序列划分为键值对 partition
然后reduce
那些对。诀窍是使用 fnil
这将取代 nil
对于尚未添加到 acc
的 key 但有值(value)0
.
这会给你一张 map :
{#{:a} 0.5, #{:b} 0.4, #{:b :a} 0.1}
如果您需要它作为值的平面序列,您可以通过 seq
传递它和flatten
:
(->> a
(partition 2)
(reduce
(fn [acc [k v]]
(update acc k (fnil + 0) v))
{})
(apply concat)
(into []))
;; => (#{:a} 0.5 #{:b} 0.4 #{:b :a} 0.1)
关于vector - 计算自定义 Clojure 向量中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36649710/