【问题标题】:Clojure, transform collection to mapClojure,将集合转换为映射
【发布时间】:2014-11-23 14:47:44
【问题描述】:

我想知道在 clojure 中迭代多个集合以创建地图的最佳方法是什么。其实我有 3 个收藏:

("Aujourd'hui" "Demain" "25.11" "26.11" "27.11" "28.11" "29.11") 
("2 °C" "2 °C" "1 °C" "0 °C" "-3 °C" "-4 °C" "0 °C") 
("8 °C" "6 °C" "4 °C" "2 °C" "1 °C" "1 °C" "5 °C")

我喜欢创建一个如下所示的地图集合:

{:date Aujourd'hui :temp-min 2°C :temp-max 8°C}{...}

并且知道这不应该那么困难,但我不知道如何正确地做到这一点。

感谢您的帮助!

【问题讨论】:

    标签: clojure


    【解决方案1】:

    我们可以使用map 为集合的每个索引构造一个哈希映射。当提供两个以上的参数时,map 会在所有集合中并行移动。

    user> (let [dates '("Aujourd'hui" "Demain" "25.11" "26.11" "27.11" "28.11" "29.11") 
                mins '("2 °C" "2 °C" "1 °C" "0 °C" "-3 °C" "-4 °C" "0 °C") 
                maxes '("8 °C" "6 °C" "4 °C" "2 °C" "1 °C" "1 °C" "5 °C")]
            (pprint (map #(hash-map :date %1 :temp-min %2 :temp-max %3) dates mins maxes)))
    ({:date "Aujourd'hui", :temp-max "8 °C", :temp-min "2 °C"}
     {:date "Demain", :temp-max "6 °C", :temp-min "2 °C"}
     {:date "25.11", :temp-max "4 °C", :temp-min "1 °C"}
     {:date "26.11", :temp-max "2 °C", :temp-min "0 °C"}
     {:date "27.11", :temp-max "1 °C", :temp-min "-3 °C"}
     {:date "28.11", :temp-max "1 °C", :temp-min "-4 °C"}
     {:date "29.11", :temp-max "5 °C", :temp-min "0 °C"})
    

    【讨论】:

      【解决方案2】:

      以下函数将表构造为列标题titlescolumns 序列的记录序列:

      (defn build-table [titles columns]
        (apply map (fn [& xs] (zipmap titles xs)) columns))
      

      :titles 的数量应该与 columns 的数量一样多。

      例如,

      (build-table [:date :temp-min :temp-max] data)
      

      在哪里

      (def data ['("Aujourd'hui" "Demain" "25.11" "26.11" "27.11" "28.11" "29.11") 
                 '("2 °C" "2 °C" "1 °C" "0 °C" "-3 °C" "-4 °C" "0 °C")
                 '("8 °C" "6 °C" "4 °C" "2 °C" "1 °C" "1 °C" "5 °C")])
      

      ...产生

       ({:temp-max "8 °C", :temp-min "2 °C", :date "Aujourd'hui"}
        {:temp-max "6 °C", :temp-min "2 °C", :date "Demain"}
        {:temp-max "4 °C", :temp-min "1 °C", :date "25.11"}
        {:temp-max "2 °C", :temp-min "0 °C", :date "26.11"}
        {:temp-max "1 °C", :temp-min "-3 °C", :date "27.11"}
        {:temp-max "1 °C", :temp-min "-4 °C", :date "28.11"}
        {:temp-max "5 °C", :temp-min "0 °C", :date "29.11"})
      

      这会将所有数据元素保留为字符串。将它们转换为数字,最好是附加单位,可以独立处理。正如他们所写的那样,例如2°C 不是有效的Clojure。

      【讨论】:

        猜你喜欢
        • 2018-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-02
        • 1970-01-01
        • 2016-01-27
        • 2011-10-25
        相关资源
        最近更新 更多