Как удалить несколько элементов из списка? - PullRequest
6 голосов
/ 02 октября 2009

У меня есть список [2 3 5], который я хочу использовать для удаления элементов из другого списка, например [1 2 3 4 5], чтобы я получил [1 4].

спасибо

Ответы [ 4 ]

17 голосов
/ 02 октября 2009

Попробуйте это:

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

, который возвращает (1 4).

Функция remove, кстати, принимает предикат и коллекцию и возвращает последовательность элементов, которые не удовлетворяют предикату (в данном примере это набор).

5 голосов
/ 02 октября 2009
user=> (use 'clojure.set)
nil
user=> (difference (set [1 2 3 4 5]) (set [2 3 5]))
#{1 4}

Справка:

1 голос
/ 04 июня 2014

Вы можете сделать это самостоятельно с помощью чего-то вроде:

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

Версия, основанная на редукторах , может быть:

(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-содержит? код

0 голосов
/ 09 января 2015

Вот мой дубль без использования наборов;

(defn my-diff-func [X Y] 
   (reduce #(remove (fn [x] (= x %2)) %1) X Y ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...