vector - 计算自定义 Clojure 向量中的重复项

标签 vector clojure

我正在尝试提出一个功能解决方案来解决由交替集和数值组成的自定义数据结构中的重复项。

一个例子:

(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/

相关文章:

c++ - 挣扎着将新内容分配给 vector 的指针

c++ - 删除 vector 类成员

c++ - 在 opencv (imwrite) 上压缩图像。如何显式设置压缩因子?

复制交替向量值

Clojure - map 索引是否可以从 0 以外的索引开始?

clojure - 在 Clojure/EDN 中序列化排序的映射?

emacs - 史莱姆有什么好处?

用一个平均值替换多个 NA

clojure - 'do' 特殊形式有什么作用?

Clojure 宏 : Passing filtered map and arity to other macro based on condition