我知道这可能是一个愚蠢的问题,但我不明白。 我有一些数据:
(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...
我知道这是微不足道的,但我怎么能这样做呢?
答案 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])
这是有效的,因为当一个集合被用作一个参数的函数时,如果它在集合内部,则返回该参数。在移除示例中,元素3
和5
会导致集合返回 truthy 值:自身。同样的事情发生在keep
和some
示例中,除了some
示例还有一个好处,就是返回集合中第一个也在集合中的元素。
答案 1 :(得分:4)
您应该使用:
(remove #(= 3 %) x)
#(= 3)
不接受参数(但remove
尝试将一个参数传递给该函数。)
#(= 3 %)
需要一个参数,并使用该参数(=
)和%
调用3
。