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)