我有两个向量:
(def x [true false true])
(def y [1 2 3])
我想根据
y
过滤 x
。我最初的尝试是这样的:
(remove nil? (map #(when %1 %2) x y))
根据需要返回
(1, 3)
。
我的问题是,有没有办法可以达到相同的结果,而不必在最后过滤掉 nils ?例如,我注意到
keep
在返回之前删除了 nils,但它似乎不像 map 那样接受多个集合。有没有更优雅的方法使用上面的掩码向量进行过滤?
有很多很多方法。
关于您的初始尝试,需要注意的一件事是
map
始终返回与其最短集合输入长度相同的序列。因此,在您的情况下,您总是会得到长度为三的序列,因此需要remove nil?
。
这是
reduce
的另一次尝试:
user> (def x [true false true])
#'user/x
user> (def y [1 2 3])
#'user/y
user> (->> (map-indexed vector y)
(reduce (fn [eax [i n]]
(if (nth x i) (conj eax n) eax))
[]))
[1 3]
如果您要使用这些类型的数组做很多事情,有一些库包含非常锋利的工具,可以非常有效地完成此类事情:
user> (require '[tech.v3.datatype.unary-pred :as un-pred])
nil
user> (un-pred/bool-reader->indexes x)
[0 2]
user> (def idxs *1)
#'user/idxs
user> (require '[tech.v3.tensor :as dtt])
nil
user> (dtt/select y idxs)
#tech.v3.tensor<object>[2]
[1 3]