2

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

(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正在做序列的完整副本,并将整个事情强制到内存中(原始数据是一个惰性序列)。

4

1 回答 1

2

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

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

这将是懒惰的,后进将获胜。

于 2013-05-01T15:19:53.123 回答