根据另一个地图的内容从地图中删除项目

Dav*_*aid 6 clojure

仍然通过编程集体智能和使用Clojure编写代码.我有它的工作,但有些部分真的很难看,所以我想我会问一些这里的专家帮忙清理它.

假设我有一个看起来像这样的地图(绑定到" recs "):

{"Superman Returns" 3.902419556891574, "Lady in the Water" 2.8325499182641614, 
"Snakes on a Plane" 3.7059737842895792, "The Night Listener" 3.3477895267131017,
"You, Me and Dupree" 2.651006036204627, "Just My Luck" 2.5309807037655645}
Run Code Online (Sandbox Code Playgroud)

我想删除那些也在地图中的键(绑定到" mymovies ")的项目:

{"Snakes on a Plane" 4.5, "You, Me and Dupree" 1.0, "Superman Returns" 4.0}
Run Code Online (Sandbox Code Playgroud)

这样我就得到了地图:

{"Lady in the Water" 2.8325499182641614, "The Night Listener" 3.3477895267131017,
"Just My Luck" 2.5309807037655645}
Run Code Online (Sandbox Code Playgroud)

我设法完成的代码如下所示:

(apply merge (map #(hash-map (first %) (second %))
              (remove #(contains? mymovies (first %))
                      recs)))
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很难看.似乎不应该从我从"删除"返回的值创建一个地图.有更清洁的方法吗?

更新:Joost的回答引发了另一个想法.如果我将两张地图的按键分成几组,我可以使用这样的select-keys:

(select-keys recs (difference (set (keys recs))
                              (set (keys mymovies))))
Run Code Online (Sandbox Code Playgroud)

Joost,谢谢你让我选择了键.我以前不知道那个功能.现在用这个新发现的知识重写其他几个部分!

pon*_*zao 13

(apply dissoc recs (keys mymovies))
Run Code Online (Sandbox Code Playgroud)