Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 合并与合并:这可以简化吗?_Clojure - Fatal编程技术网

Clojure 合并与合并:这可以简化吗?

Clojure 合并与合并:这可以简化吗?,clojure,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}] (我对这个

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

(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-works有效,但事实是,我并不真正关心重叠值会发生什么;先入者或后入者可以获胜)

我得到的是:

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

这确实管用,但我想知道是否有更好、更体贴、更优雅的方法。另外,我想知道性能,因为我认为
into
是对序列进行完整复制,并将整个内容强制存储到内存中(原始数据是一个惰性序列)。

如果您确信具有相同
:id
的映射始终是连续的,您可以使用
partitionby
按id创建数据的子序列,并合并这些子序列:

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

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

是否有对
数据的排序保证?我们是否知道具有相同
:id
的所有地图将同时显示?(如果你不能保证这一点,那么懒洋洋地做是不可能的!)是的,它们是连续的。它们是数据库查询的结果集。太棒了。我还有一个问题:假设贴图有重叠的键,但有时值为nil(我想取第一个(或最后一个)非nil值)?如果这更有意义,我可以单独提问。nm…
merge with
可以轻松做到这一点。再次感谢!是的,
合并,并使用类似于
%的合并函数(if(nil?%2)%1%2)
。如果没有
false
作为值,这很好;否则,您应该显式地测试
nil