【问题标题】:Filter for Lists in ClojureClojure 中的列表过滤器
【发布时间】:2010-11-10 13:38:28
【问题描述】:

我对 Clojure 中的列表有点困难 我有一个关于过滤功能的小问题

假设我有一个由地图组成的列表 我的代码是:

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

我将如何过滤我的列表,例如:我希望列表减去 Person2(意思是减去任何具有 :name Eric 的地图)

非常感谢所有帮助我的人。这是我保证的最后一个问题

【问题讨论】:

    标签: list map clojure


    【解决方案1】:

    为此,最好使用“删除”功能。它需要一个序列,并删除它的谓词返回“真”的元素。它基本上与过滤器相反。这是我通过 REPL 处理的一个示例,以及过滤器用于相同目的的用法。

    用户> (def m1 {:name "eric" :age 32}) #'用户/m1 用户> (def m2 {:name "Rayne" :age 15}) #'用户/平方米 用户> (def m3 {:name "connie" :age 44}) #'用户/m3 用户> (def mylist (list m1 m2 m3)) #'用户/我的列表 user> (filter #(not= (:name %) "eric") mylist) ({:name "eric", :age 32}) 用户> (删除#(= (:name %) "eric") mylist) ({:name "Rayne", :age 15} {:name "connie", :age 44})

    如您所见,remove 更简洁一些,因为您不必使用 not=。此外,在使用地图时,您不必使用“get”函数,除非您希望它在地图中没有键的情况下返回一些特殊的东西。如果您知道要查找的密钥将在地图中,则没有理由使用“获取”。祝你好运!

    【讨论】:

      【解决方案2】:

      假设你有这样的东西:

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

      这可行:

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

      【讨论】:

        【解决方案3】:

        user=> (filter (fn [person] (not= (person :name) "Eric")) mylist) ({:name "Bob"} {:name "Tim"})

        或者使用更简洁的语法:

        user=> (filter #(not= (% :name) "Eric") mylist) ({:name "Bob"} {:name "Tim"})

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 2018-12-30
          相关资源
          最近更新 更多