You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用掩码向量过滤另一向量?无需过滤nil的优雅实现

Clojure中基于掩码向量过滤集合的优雅实现

你有两个向量:

(def x [true false true]) 
(def y [1 2 3])

希望基于x作为掩码过滤y,初始实现是:

(remove nil? (map #(when %1 %2) x y)) 

能得到预期的(1, 3),但想找无需额外过滤nil的更优雅实现,这里有几种方案:

方案1:利用keep的多集合支持

你提到keep似乎不支持多集合,但其实它和map的参数形式完全一致——可以接受多个集合,函数会依次接收各集合对应位置的元素。直接用keep替代map+remove nil?即可:

(keep (fn [mask val] (when mask val)) x y)

keep会自动丢弃函数返回的nil值,直接得到过滤后的结果(1 3),这是最简洁的写法。

方案2:用keep-indexed通过索引关联

通过索引把y的元素和x中对应位置的掩码关联起来,判断掩码为真时保留元素:

(keep-indexed #(when (nth x %) %2) y)

keep-indexed会遍历y的每个元素及其索引,当x对应索引位置为true时返回元素,否则返回nil,同样会自动过滤掉nil。

方案3:先配对再过滤

先把x和y的元素一一配对成向量,过滤出掩码为true的配对,再提取对应的值:

(map second (filter first (map vector x y)))

步骤分解:

  1. (map vector x y) 生成 ([true 1] [false 2] [true 3])
  2. (filter first ...) 筛选出第一个元素为true的配对,得到 ([true 1] [true 3])
  3. (map second ...) 提取每个配对的第二个元素,得到 (1 3)

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:45:03