2009-07-14 10 views
5

Sto avendo un po 'di difficoltà con liste in Clojure Ho una domanda veloce per quanto riguarda la funzione di filtrofiltro per gli elenchi in Clojure

Diciamo che ho una lista composta da mappe Il mio codice è:

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

Come potrei fare per filtrare la mia lista in modo che, per esempio: io voglio la lista meno Person2 (significato meno qualsiasi mappa che ha :name Eric)

Grazie mille a tutti mi dare una mano. Questa è la mia ultima domanda lo prometto

risposta

3

Supponiamo di avere qualcosa di simile:

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

Questo potrebbe funzionare:

(filter #(not= "Eric" (get % :name)) mylist) 
15

A tal fine, è meglio utilizzare la funzione di 'rimozione'. Richiede una sequenza e rimuove gli elementi su cui il predicato restituisce 'true'. È fondamentalmente l'opposto del filtro. Ecco un esempio di esso e l'utilizzo del filtro per gli stessi scopi, che ho elaborato tramite 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}) 

Come si può vedere, rimuovere è un po 'più pulito, perché non si dispone di non usare =. Inoltre, quando si lavora con le mappe, non è necessario utilizzare la funzione 'get' a meno che non si desideri restituire qualcosa di speciale se una chiave non è presente nella mappa. Se sai che la chiave che stai cercando sarà sulla mappa, non c'è motivo di usare 'get'. In bocca al lupo!

Problemi correlati