我有一个映射列表,映射中的一个键是可能重复的键。我想对列表进行重复数据删除/合并。举个例子:
(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}](我提出这个问题是为了让merge/merge-with工作,但事实是,我并不真正关心重叠的值会发生什么;第一个进入或最后一个进入的人可能会获胜)。
我得到的是:
(vals (apply merge-with merge (into #(hash-map (:id %) %) data)))这确实行得通,但我想知道是否有更好、更周到或更优雅的方式来做这件事。我还想知道性能,因为我认为into正在对序列进行完整的复制,并将整个过程强制到内存中(原始数据是一个惰性序列)。
发布于 2013-05-01 23:19:53
如果您确信具有相同:id的地图将始终是连续的,则可以使用partition-by根据id创建数据的子序列并合并这些子序列:
(map (partial apply merge) (partition-by :id data))这将是懒惰的,最后一位将获胜。
https://stackoverflow.com/questions/16320739
复制相似问题