首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >merge-with merge:可以简化吗?

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

Stack Overflow用户
提问于 2013-05-01 23:07:23
回答 1查看 462关注 0票数 2

我有一个映射列表,映射中的一个键是可能重复的键。我想对列表进行重复数据删除/合并。举个例子:

代码语言:javascript
复制
(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}])

最后,我想说:

代码语言:javascript
复制
[{: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工作,但事实是,我并不真正关心重叠的值会发生什么;第一个进入或最后一个进入的人可能会获胜)。

我得到的是:

代码语言:javascript
复制
(vals (apply merge-with merge (into #(hash-map (:id %) %) data)))

这确实行得通,但我想知道是否有更好、更周到或更优雅的方式来做这件事。我还想知道性能,因为我认为into正在对序列进行完整的复制,并将整个过程强制到内存中(原始数据是一个惰性序列)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-01 23:19:53

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

代码语言:javascript
复制
(map (partial apply merge) (partition-by :id data))

这将是懒惰的,最后一位将获胜。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16320739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档