Фильтр для списков в Clojure - PullRequest
5 голосов
/ 14 июля 2009

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

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

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

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

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

Ответы [ 2 ]

16 голосов
/ 14 июля 2009

Для этой цели лучше использовать функцию «удалить». Он принимает последовательность и удаляет элементы, для которых его предикат возвращает значение true. Это в основном противоположность фильтра. Вот пример этого и использование фильтра для тех же целей, которые я разработал через 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})

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

4 голосов
/ 14 июля 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)
...