如何从列表中删除特定元素?

m3n*_*hal 3 clojure

我知道这可能是一个愚蠢的问题,但我不明白.我有一些数据:

(def x (range 1 14))

-> (1 2 3 4 5 6 7 8 9 10 11 12 13)
Run Code Online (Sandbox Code Playgroud)

我想返回一个没有"3"的列表.谷歌搜索"clojure从列表中删除项目"带我到这个:

  (remove pred coll)
Run Code Online (Sandbox Code Playgroud)

所以我试着用例子even?:

  (remove even? x) 

  -> (1 3 5 7 9 11 13)
Run Code Online (Sandbox Code Playgroud)

大!它适用于我的数据!我只需要改变pred.我的第一个猜测是:

  (remove (= 3) x)

  java.lang.ClassCastException: java.lang.Boolean cannot be cast to clojure.lang.IFn
Run Code Online (Sandbox Code Playgroud)

好的,我们不需要评估(= 3),所以我们#先说:

  (remove #(= 3) x)

  clojure.lang.ArityException: Wrong number of args (1)` passed to...
Run Code Online (Sandbox Code Playgroud)

我知道这是微不足道的,但我怎么能这样做呢?

小智 7

我喜欢用套装来做这种事情.好干净..

删除元素:

(remove #{3 5} [1 2 3 4 5 6 7 8 9])

保持元素:

(keep #{7 5 3} [1 2 3 4 5 6 7 8 9])

检查元素是否存在:

(some #{5} [1 2 3 4 5 6 7 8 9])

这是有效的,因为当一个集合被用作一个参数的函数时,如果它在集合内部,则返回该参数.在删除实例中,元件35使所述组返回一个truthy值:自己.对于keepsome示例都会发生同样的事情,除了some示例还有一个额外的好处,就是返回集合中第一个也在集合中的元素.


slo*_*oth 5

您应该使用:

(remove #(= 3 %) x)
Run Code Online (Sandbox Code Playgroud)

#(= 3)不接受参数(但remove尝试将一个参数传递给该函数)。

#(= 3 %)接受一个参数,并=使用该参数(%)和进行调用3

  • 或`(partial = 3)` (4认同)