如何从Clojure中的序列中删除项目?

时间:2009-06-02 12:39:03

标签: clojure sequences

首先,我假设每个特定于结构的序列都有不同的方法来删除项目: Vectors 可以通过索引, List 可以先删除或删除,< em> Set 应该传递要删除的实际项目等。

其次,我假设有一些与结构无关的删除方法;他们在 seq 界面上工作。

由于序列在Clojure中是不可变的,我怀疑你实际做的是制作一份原始的廉价副本,只是没有原始项目。这意味着列表理解可以用于删除,但我怀疑这将是不必要的冗长。

请举例说明从Clojure序列中删除项目的不同方法。

3 个答案:

答案 0 :(得分:43)

没有单一的接口可以从Clojure的所有数据结构类型中删除东西,可能是因为性能特征不同。

(disj #{:foo :bar} :foo)       ; => #{:bar}
(dissoc {:foo 1 :bar 2} :foo)  ; => {:bar 2}
(pop [:bar :foo])              ; => [:bar]
(pop (list :foo :bar))         ; => (:bar)

这些也有效(返回seq):

(remove #{:foo} #{:foo :bar})      ; => (:bar)
(remove #{:foo} [:foo :bar])       ; => (:bar)
(remove #{:foo} (list :foo :bar))  ; => (:bar)

这对哈希映射不起作用,因为当您遍历地图时,您将获得键/值对。但这有效:

(remove (fn [[k v]] (#{:foo} k)) {:foo 1 :bar 2})  ; => ([:bar 2])

答案 1 :(得分:12)

查看Clojure reference for sequences。您寻求的是filterremove

答案 2 :(得分:2)

作为Brian Carper答案的延伸。这取决于你将如何处理结果。如果您将结果传递给想要处理整个数据集的内容(即打印它),那么使用seq并使用过滤器或删除来懒散地解决问题是不恰当的。另一方面,如果您正在修改数据结构以保存以用于以后的各种用途,那么在其上创建seq将失去其有利的更新特性,因此在这种情况下最好使用特定于该数据结构的更新函数。