merge-with merge:这可以简化吗?

时间:2013-05-01 15:07:23

标签: clojure

我有一张地图列表,地图中的一个键是可能重复的键。我想重复删除/合并列表。例如:

(def data [{:id 1 :a 2 :b 3 :c 4} {:id 1 :c 5 :d 6} {:id 2 :a 100 :b 101 :c 102} {:id 2 :a 103 :d 104} {:id 2 :a 200 :f 201}])

我想最终:

[{:id 1 :a 2 :b 3 :c 5 :d 6} {:id 2 :a 200 :b 101 :c 102 :d 104 :f 201}]

(我已经说过这个问题,以便合并/合并 - 但是事实是我并不关心重叠值会发生什么;第一个,或者最后一个,可以赢得)。

我得到的是:

(vals (apply merge-with merge (into #(hash-map (:id %) %) data)))

哪种方法有效,但我想知道是否有更好,更有意义或更优雅的方式。我也想知道性能,因为我认为into正在执行序列的完整副本,并强制整个事物进入内存(原始数据是一个惰性序列)。

1 个答案:

答案 0 :(得分:2)

如果您确定具有相同:id的地图将始终是连续的,您可以使用partition-by按ID创建数据的子序列并合并这些子序列:

(map (partial apply merge) (partition-by :id data))

这将是懒惰的,并且最后一次将获胜。