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

时间:2015-03-27 13:45:33

标签: clojure

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

(def x (range 1 14))

-> (1 2 3 4 5 6 7 8 9 10 11 12 13)

我想要返回一个没有" 3"例如。 谷歌搜索" clojure从列表中删除项目"把我带到了这个:

  (remove pred coll)

所以我尝试使用even?的示例:

  (remove even? x) 

  -> (1 3 5 7 9 11 13)

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

  (remove (= 3) x)

  java.lang.ClassCastException: java.lang.Boolean cannot be cast to clojure.lang.IFn

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

  (remove #(= 3) x)

  clojure.lang.ArityException: Wrong number of args (1)` passed to...

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

2 个答案:

答案 0 :(得分:5)

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

删除元素:

(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示例还有一个好处,就是返回集合中第一个也在集合中的元素。

答案 1 :(得分:4)

您应该使用:

(remove #(= 3 %) x)

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

#(= 3 %)需要一个参数,并使用该参数(=)和%调用3