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

How can I remove specific element from a list?

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

(def x (range 1 14))

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

我想要 return 一个没有“3”的列表。 谷歌搜索 "clojure remove item from list" 把我带到了这个:

  (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...

我知道这是微不足道的,但我该怎么办?

你应该使用:

(remove #(= 3 %) x)

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

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

调用 =

我喜欢用布景做这种事。好干净..

删除元素:

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

这是有效的,因为当一个集合被用作一个参数的函数时,它 return 如果它在集合内部,它就是参数。在删除示例中,元素 35 使集合成为 return 一个 truthy 值:他们自己。 keepsome 示例都会发生同样的事情,除了 some 示例具有 returning 集合中第一个元素的额外好处,该元素也在放。