Фильтр списков в Clojure

У меня возникли некоторые трудности со списками в Clojure. У меня быстрый вопрос относительно функции фильтрации.

Допустим, у меня есть список карт. Мой код:

(def Person {:name Bob } )
(def Person2 {:name Eric } )
(def Person3 {:name Tim } )
(def mylist (list Person Person2 Person3))

Как мне отфильтровать свой список, чтобы, например: я хочу, чтобы список минус Person2 (то есть минус любая карта, на которой есть :name Eric)

Большое спасибо всем, кто помогал мне. Это мой последний вопрос, который я обещаю


person Community    schedule 14.07.2009    source источник


Ответы (3)


Для этого лучше использовать функцию «удалить». Он берет последовательность и удаляет элементы, для которых его предикат возвращает «истина». По сути, это противоположность фильтра. Вот пример этого и использования фильтра для тех же целей, которые я разработал с помощью REPL.

user> (def m1 {:name "eric" :age 32})
#'user/m1
user> (def m2 {:name "Rayne" :age 15})
#'user/m2
user> (def m3 {:name "connie" :age 44})
#'user/m3
user> (def mylist (list m1 m2 m3))
#'user/mylist
user> (filter #(not= (:name %) "eric") mylist)
({:name "eric", :age 32})
user> (remove #(= (:name %) "eric") mylist)
({:name "Rayne", :age 15} {:name "connie", :age 44})

Как видите, remove немного чище, потому что вам не нужно использовать not =. Кроме того, при работе с картами вам не нужно использовать функцию get, если вы не хотите, чтобы она возвращала что-то особенное, если ключа нет на карте. Если вы знаете, что ключ, который вы ищете, будет на карте, нет причин использовать «get». Удачи!

person Rayne    schedule 14.07.2009

Предположим, у вас есть что-то вроде этого:

(def Person {:name "Bob" } ) 
(def Person2 {:name "Eric" } ) 
(def Person3 {:name "Tim" } ) 
(def mylist (list Person Person2 Person3))

Это сработает:

(filter #(not= "Eric" (get % :name)) mylist)
person Ainuyew    schedule 14.07.2009

user => (filter (fn [person] (not = (person: name) "Эрик")) mylist) ({: name "Bob"} {: name "Tim"})

или используя более компактный синтаксис:

user => (filter # (not = (%: name) "Eric") mylist) ({: name "Bob"} {: name "Tim"})

person Armando Moran    schedule 06.09.2019