我有一个未排序的 map 序列(电视节目)需要合并,这意味着生成的序列基于特殊键(:标题)是唯一的,并且其他键与重复项合并。可以将其视为将特定电视节目的所有放映合并到一个包含有关它们的所有信息的单个条目中。
程序看起来像这样(简化):
[{:prog {:title "", ...} :starts #{} :directors #{} :actors #{} :categories {}}, ...]
这是我当前执行合并的函数:
(defn- merge-programs [all-programs]
"Merge all instances of the same program"
(loop [acc []
programs all-programs]
(if (empty? programs)
acc
(let [first-prog (first programs)
dups (filter #(= (:title first-prog) (:title (:prog %))) programs)
merged-prog {:prog first-prog
:starts (apply set/union (map :starts dups))
:directors (apply set/union (map :directors dups))
:actors (apply set/union (map :actors dups))
:categories (apply set/union (map :categories dups))}]
(recur (conj acc merged-prog)
(remove #(= (:title first-prog) (:title (:prog %)))) programs))))))
我正在尝试找出如何并行进行合并。但是,由于在循环的每次迭代之后,开始序列的“随机”元素都被删除,因此必须采用某种分而治之的方法。
关于如何做到这一点有什么想法吗?
最佳答案
Reducers Clojure 1.5 中的功能正是您想要的。
关于clojure - 如何并行减少 Clojure 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14901719/