我有一张地图列表,地图中的一个键是可能重复的键。我想重复删除/合并列表。例如:
(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
正在执行序列的完整副本,并强制整个事物进入内存(原始数据是一个惰性序列)。
答案 0 :(得分:2)
如果您确定具有相同:id
的地图将始终是连续的,您可以使用partition-by
按ID创建数据的子序列并合并这些子序列:
(map (partial apply merge) (partition-by :id data))
这将是懒惰的,并且最后一次将获胜。