我有一个列表[2 3 5],我想用它来移除另一个列表中的项目,如[1 2 3 4 5],这样我得到[1 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 ))