删除Clojure 2D向量中的nil

删除Clojure 2D向量中的nil,clojure,Clojure,在Clojure中删除2D向量中的零的最佳方法是什么 [[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]] 通过确保子向量

在Clojure中删除2D向量中的零的最佳方法是什么

[[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]]
通过确保子向量不只是充满零来过滤向量。如果你想用nil过滤掉任何向量,用some代替every?。如果要保留(可能为空)子向量,请使用“过滤器”而不是“每个”?:

(filter (fn [x] (filter not-nil x) your-vec)
通过确保子向量不只是充满零来过滤向量。如果你想用nil过滤掉任何向量,用some代替every?。如果要保留(可能为空)子向量,请使用“过滤器”而不是“每个”?:

(filter (fn [x] (filter not-nil x) your-vec)

如果元素满足给定谓词函数的条件,则可以使用
remove
从集合中移除元素。现在,您可以使用
set
作为函数,因此可以使用set
{[nil]}
删除不需要的元素,如下所示:

user=>(def elems[[250 634][[450 598][250 651][[450 615][250 668][[450 632][250 685][[450 649][259 700][[450 666][323700][[450 683][386 700][nil nil][nil nil][nil nil][nil nil][nil nil][nil nil][nil nil][nil]
#“用户/要素”
user=>(删除#{[nil-nil]}元素)
([[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]])

如果元素满足给定谓词函数的条件,则可以使用
remove
从集合中删除元素。现在,您可以使用
set
作为函数,因此可以使用set
{[nil]}
删除不需要的元素,如下所示:

user=>(def elems[[250 634][[450 598][250 651][[450 615][250 668][[450 632][250 685][[450 649][259 700][[450 666][323700][[450 683][386 700][nil nil][nil nil][nil nil][nil nil][nil nil][nil nil][nil nil][nil]
#“用户/要素”
user=>(删除#{[nil-nil]}元素)
([[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]])

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]]


我刚刚注意到,这个答案基本上与相同,只是这个答案将答案转换回向量。

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]]


我刚刚注意到,这个答案基本上与相同,只是这一个将答案转换回向量。

好的,我理解,但“not nil”不起作用。无法解析符号:此处为not nilcontext@droizenberg
(defn not nil[x](not(nil?x)))
(筛选(fn[x](not any?nil?x))您的vec)
顺便说一下,这些函数在@BipedPhill中列出,谢谢。有时候,我只是用我能记住的积木,而不是用谷歌搜索短的积木,你的记忆力一定比我好<代码>(删除(fn[x](一些零?x))您的vec)
好的,我理解,但“not nil”不起作用无法解析符号:此处为not nilcontext@droizenberg
(defn not nil[x](not(nil?x)))
(filter(fn[x](not any?nil?x))您的vec)
顺便说一句,这些函数列在@BipedPhill上,谢谢。有时候,我只是用我能记住的积木,而不是用谷歌搜索短的积木,你的记忆力一定比我好<代码>(删除(fn[x](一些零?x))您的vec)