Clojure,将集合转换为地图

时间:2014-11-23 14:47:45

标签: clojure

我想知道迭代许多集合以在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}{...}

并且知道它不应该那么困难,但我无法弄清楚如何做到这一点。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

我们可以使用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"})

答案 1 :(得分:1)

以下函数将表构建为列标题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。