首先,我假设每个特定于结构的序列都有不同的方法来删除项目: Vectors 可以通过索引, List 可以先删除或删除,< em> Set 应该传递要删除的实际项目等。
其次,我假设有一些与结构无关的删除方法;他们在 seq 界面上工作。
由于序列在Clojure中是不可变的,我怀疑你实际做的是制作一份原始的廉价副本,只是没有原始项目。这意味着列表理解可以用于删除,但我怀疑这将是不必要的冗长。
请举例说明从Clojure序列中删除项目的不同方法。
答案 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。您寻求的是filter
和remove
。
答案 2 :(得分:2)
作为Brian Carper答案的延伸。这取决于你将如何处理结果。如果您将结果传递给想要处理整个数据集的内容(即打印它),那么使用seq并使用过滤器或删除来懒散地解决问题是不恰当的。另一方面,如果您正在修改数据结构以保存以用于以后的各种用途,那么在其上创建seq将失去其有利的更新特性,因此在这种情况下最好使用特定于该数据结构的更新函数。