【问题标题】:clojure filter nested map to return keys based on inner map valuesclojure 过滤嵌套映射以根据内部映射值返回键
【发布时间】:2013-11-10 03:43:16
【问题描述】:

对于这个名为“tables”的嵌套地图,

  (def tables 
   {:tableA {:occupied false :party nil} 
    :tableB {:occupied true :party nil}
    :tableC {:occupied false :party nil}})

如何过滤并取回 :occupied = false 的键?

正确的结果应该是(:tableA :tableC)

我可以用“过滤器”HOF 做到这一点吗?我应该使用列表理解吗?

【问题讨论】:

    标签: map clojure


    【解决方案1】:

    你可以用keep轻松做到这一点:

    (keep (fn [[k v]] (if-not (:occupied v) k)) tables)
    

    但是,正如您所观察到的,每当您映射/过滤序列时,使用for 通常是一个很好的解决方案,尤其是在您处理嵌套序列时。

    (for [[k v] tables :when (not (:occupied v))] k)
    

    我通常更喜欢使用for,尤其是当我想对目标项目使用解构时。在这种情况下,解构很适合将键/值对与[k v] 绑定。

    【讨论】:

    • 谢谢!我以为我可以使用 for,但无法找出正确的语法来使它真正起作用。
    【解决方案2】:

    我不确定您的用例是什么,但我可以建议将您的数据构建为一组地图吗?集合具有某些属性,允许您使用关系代数查询它们,类似于在 SQL 中查询表的方式。 clojure.set/select 函数类似于 SQL 中的 WHERE。

    (use 'clojure.set)
    
    (def tables
        #{{:table "A" :occupied false :party nil} 
          {:table "B" :occupied true :party nil}
          {:table "C" :occupied false :party nil}})
    
    (select #(= false (:occupied %)) tables)
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢,我会考虑这个。我还没有弄清楚我是否想要一组地图,或者一张地图,一个地图矢量......我对clojure还是很陌生。我可能需要一组地图。
    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    相关资源
    最近更新 更多