在Clojure中去除2D矢量中的nils的最佳方法是什么?
[[250 634]] [[450 598] [250 651]] [[450 615] [250 668]] [[450 632] [250 685]] [[450 649] [259 700]] [[450 666] [323 700]] [[450 683] [386 700]] [nil nil] [nil nil] [nil nil] [nil nil] [nil nil] [nil nil] [nil nil]]
如果元素满足给定谓词函数的条件,则可以使用remove
从集合中删除元素。现在,您可以使用set
作为函数,因此您可以使用 set#{[nil nil]}
删除不需要的元素,如下所示:
user=> (def elems [[[250 634]] [[450 598] [250 651]] [[450 615] [250 668]] [[450 632] [250 685]] [[450 649] [259 700]] [[450 666] [323 700]] [[450 683] [386 700]] [nil nil] [nil nil] [nil nil] [nil nil] [nil nil] [nil nil] [nil nil]])
#'user/elems
user=> (remove #{[nil nil]} elems)
([[250 634]] [[450 598] [250 651]] [[450 615] [250 668]] [[450 632] [250 685]] [[450 649] [259 700]] [[450 666] [323 700]] [[450 683] [386 700]])
(filter (fn [x] (every? not-nil x) your-vec)
通过确保子向量不仅充满 nil 来过滤向量。如果你想过滤掉任何带有 nil 的向量,请使用一些而不是每个?。如果你想保留(可能为空的)子向量,那么使用过滤器而不是每一个?
(filter (fn [x] (filter not-nil x) your-vec)
mapv
是返回向量的map
的变体。以同样的方式,可以定义removev
:返回向量的remove
变体:
(defn removev [pred v]
(into [] (remove pred v)))
我们可以创建一个谓词,通过将[nil nil]
包装在一个集合中来检测:#{[nil nil]}
.
通过结合这些,我们得到了我们想要的:
(removev #{[nil nil]} [[1 3] [nil nil] [2 nil]])
=> [[1 3] [2 nil]]
我刚刚注意到这个答案与Denis Fuenzola的答案基本相同,只是这个答案将答案转换回向量。