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

Rob*_*ell 34 sequences clojure

首先,我假设每个特定于结构的序列都有不同的方法来删除项目:向量可以是索引,列表可以是第一个或最后一个,Set应该是要删除的实际项目的传递等.

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

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

请给出一些惯用的例子,说明从Clojure序列中删除项目的不同方法.

Bri*_*per 43

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

(disj #{:foo :bar} :foo)       ; => #{:bar}
(dissoc {:foo 1 :bar 2} :foo)  ; => {:bar 2}
(pop [:bar :foo])              ; => [:bar]
(pop (list :foo :bar))         ; => (:bar)
Run Code Online (Sandbox Code Playgroud)

这些也有效(返回seq):

(remove #{:foo} #{:foo :bar})      ; => (:bar)
(remove #{:foo} [:foo :bar])       ; => (:bar)
(remove #{:foo} (list :foo :bar))  ; => (:bar)
Run Code Online (Sandbox Code Playgroud)

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

(remove (fn [[k v]] (#{:foo} k)) {:foo 1 :bar 2})  ; => ([:bar 2])
Run Code Online (Sandbox Code Playgroud)


Sva*_*nte 12

查看序列Clojure参考. filter并且remove是你寻求的.