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

标签 clojure sequences

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

其次,我假设有一些与结构无关的移除方法;他们在 seq 接口(interface)上工作。

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

请给出一些从 Clojure 序列中删除项目的不同方法的惯用示例。

最佳答案

没有一个接口(interface)可以从 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])

关于clojure - 如何从 Clojure 中的序列中删除项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/939278/

相关文章:

interface - 在非泛型 F# 接口(interface)中创建和使用泛型函数

F#:InvalidOperationException:输入序列的元素数量不足?

ruby - 按连续序列拆分数组

postgresql - 在 PostgreSQL 中递增多列序列

python - 使用 python 生成器的 Collat​​z 猜想序列长度

asynchronous - 为什么 Clojure 的异步库不能处理 Go 素数筛选?

types - 这个 clojure.core.typed 类型错误是什么意思?

unit-testing - 如何使用 `with-redefs` 始终从函数中抛出异常

clojure - 具体化,ToString

clojure - Compojure 路由丢失参数信息