【发布时间】:2014-04-19 10:41:00
【问题描述】:
我有一个如下所示的列表:
({:course 2, :mark 9} {:course 5, :mark 8} {:course 6, :mark 10})
我想把它转换成 hashmap:
{:2 9 :5 8 :6 10}
列表是从mysql数据库创建的,我不知道我能不能从数据库中获取其他格式的数据,这样更容易转换成一个hashmap,我使用了java.jdbc查询函数。
谁能帮帮我?
【问题讨论】:
我有一个如下所示的列表:
({:course 2, :mark 9} {:course 5, :mark 8} {:course 6, :mark 10})
我想把它转换成 hashmap:
{:2 9 :5 8 :6 10}
列表是从mysql数据库创建的,我不知道我能不能从数据库中获取其他格式的数据,这样更容易转换成一个hashmap,我使用了java.jdbc查询函数。
谁能帮帮我?
【问题讨论】:
(fn [data] (into {} (map (juxt :course :mark) data)))
在
(list {:course 2, :mark 9} {:course 5, :mark 8} {:course 6, :mark 10})
生产
{2 9, 5 8, 6 10}
keyword 函数不接受数字作为参数,所以我不认为你能得到你想要的东西。但无论如何,数字和关键字一样好。
错了!正如其他人所展示的,Clojure 接受数字 strings 作为关键字。我们可以调整以上内容以使用这样的:
(fn [data] (into {} (map (juxt (comp keyword str :course) :mark) data)))
在
(list {:course 2, :mark 9} {:course 5, :mark 8} {:course 6, :mark 10})
生产
{:2 9, :5 8, :6 10}
但是,正如我所说,我认为这是不必要的冒险。为什么不直接使用数字作为键呢?
进一步使用数字(字符串)作为关键字:
【讨论】:
juxt 在这里是个好主意!为了练习,这里是获得确切请求输出的解决方案:(fn [data] (into {} (map (juxt #(keyword (str (:course %))) :mark) data)))
juxt 非常具有表现力。另一种表达内在功能的方式是#(-> % :course str keyword),如果你在打代码高尔夫:仍然是一个比我长的角色,呵呵。
另一个变种。 (如果您有大量数据,可能效率低于缩略图。)
(zipmap (map (comp keyword str :course) data)
(map :mark data))
data 采用问题中指定的格式。
【讨论】:
(apply zipmap (map #(map % data) [(comp keyword str :course) :mark]))