Clojure中的类型查询中不存在/不存在

Clojure中的类型查询中不存在/不存在,clojure,Clojure,我有两个数据结构,如下所示 (ns test) (def l [{:name "Sean" :age 27} {:name "Ross" :age 27} {:name "Brian" :age 22}]) (def r [{:owner "Sean" :item "Beer" } {:owner "Sean" :item "Pizza"} {:owner "Ross" :item "Computer"} {:owner "Matt" :item

我有两个数据结构,如下所示

(ns test)

(def l 
  [{:name "Sean" :age 27} 
   {:name "Ross" :age 27}
   {:name "Brian" :age 22}])

(def r 
  [{:owner "Sean" :item "Beer" }
   {:owner "Sean" :item "Pizza"}
   {:owner "Ross" :item "Computer"} 
   {:owner "Matt" :item "Bike"}])
我想找不拥有任何物品的人。在本例中,Brian如此[{:姓名Brian:age 22}]
如果这是SQL,我会做左外部连接或不存在,但我不知道如何在clojure中以更高效的方式做这件事

你基本上想在l上做一个过滤器,但不是。我们不能满足这个条件,但是remove函数已经为我们实现了这一点。比如:

(let [owner-names (set (map :owner r))]
  (remove #(owner-names (% :name)) l))

我认为它更适合于集合,但是如果你想避免分配集合,你可以只做remove fn[person]some=%:owner person:name r l.

你基本上想在l上做一个过滤器,但不是。我们不能满足这个条件,但是remove函数已经为我们实现了这一点。比如:

(let [owner-names (set (map :owner r))]
  (remove #(owner-names (% :name)) l))

我认为它更适合集合,但是如果你想避免分配集合,你可以删除fn[person]some=%:owner person:name r l.

而Chuck的解决方案肯定是最明智的,我发现有趣的是,可以使用clojure.set根据关系代数运算符编写解决方案:


虽然Chuck的解决方案无疑是最明智的,但我发现有趣的是,可以使用clojure.set编写关系代数运算符的解决方案:


我同意使用集合看起来更好,但我会压缩它以删除comp set map:owner r:name lAlso,分配集合可能会为重复线性扫描r节省大量时间。我同意使用集合看起来更好,但我会压缩它以删除comp set map:owner r:name lAlso,分配集合可以为您节省大量重复线性扫描r的时间。