如何从列表中删除多个项目?

时间:2009-10-02 12:27:19

标签: clojure

我有一个列表[2 3 5],我想用它来移除另一个列表中的项目,如[1 2 3 4 5],这样我得到[1 4]。

感谢

4 个答案:

答案 0 :(得分:17)

试试这个:

(let [a [1 2 3 4 5]
      b [2 3 5]]
  (remove (set b) a))

返回(1 4)

顺便说一下,remove函数接受一个谓词和一个集合,并返回一个不满足谓词的元素序列(在本例中是一个集合)。

答案 1 :(得分:5)

user=> (use 'clojure.set)
nil
user=> (difference (set [1 2 3 4 5]) (set [2 3 5]))
#{1 4}

参考:

答案 2 :(得分:1)

您可以使用以下内容自行完成此操作:

(def a [2 3 5])
(def b [1 2 3 4 5])

(defn seq-contains? 
  [coll target] (some #(= target %) coll))

(filter #(not (seq-contains? a %)) b)
; (3 4 5)

基于reducers库的版本可以是:

(require '[clojure.core.reducers :as r])

(defn seq-contains? 
 [coll target] 
   (some #(= target %) coll))

(defn my-remove
"remove values from seq b that are present in seq a"
 [a b]
 (into [] (r/filter #(not (seq-contains? b %)) a)))

(my-remove [1 2 3 4 5] [2 3 5] )
; [1 4]

编辑 添加了seq-contains?代码

答案 3 :(得分:0)

这是我在不使用套装的情况下拍摄的;

(defn my-diff-func [X Y] 
   (reduce #(remove (fn [x] (= x %2)) %1) X Y ))