我对Clojure中的列表有点困难我有一个关于过滤器功能的快速问题
假设我有一个由地图组成的列表我的代码是:
(def Person {:name Bob } )
(def Person2 {:name Eric } )
(def Person3 {:name Tim } )
(def mylist (list Person Person2 Person3))
我将如何过滤我的列表,例如:我希望列表减去Person2(意味着减去任何有:nameEric的地图)
非常感谢大家帮助我.这是我保证的最后一个问题
Ray*_*yne 17
为此,最好使用"删除"功能.它接受一个序列,并删除它的谓词返回'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 =.此外,在使用地图时,您不必使用"获取"功能,除非您希望如果某个键不在地图中,则返回一些特殊功能.如果您知道要查找的密钥将在地图中,则没有理由使用"获取".祝好运!
小智 5
假设你有这样的事情:
(def Person {:name "Bob" } )
(def Person2 {:name "Eric" } )
(def Person3 {:name "Tim" } )
(def mylist (list Person Person2 Person3))
Run Code Online (Sandbox Code Playgroud)
这会起作用:
(filter #(not= "Eric" (get % :name)) mylist)
Run Code Online (Sandbox Code Playgroud)