2012-07-26 29 views
4

鉴于键多懒序列插入地图

:id 
:tag 
:name 

和形式产生输出三个懒汉序列

(id1 id2 id3 ...) 
(name1 name2 name3 ...) 
(type1 type2 type3 ...) 

什么做我必须做这样的形式获取地图的序列

({id: id1 :name name1 :type type1} 
{id: id2 :name name2 :type type2} 
{id: id3 :name name3 :type type3} 
...) 

我尝试了apply,map,assoc等的各种组合,但没有得到它。

+0

这三个答案都适用于我。感谢clojure新手。 – mmoehring 2012-07-27 19:21:20

回答

11

你只需要map

(map (fn [id name type] {:id id :name name :type type}) 
    (id1 id2 id3 ...) 
    (name1 name2 name3 ...) 
    (type1 type2 type3 ...)) 
1

我会去用:

(map hash-map (repeat :id) seq1 (repeat :name) seq2 (repeat :type) seq3) 

假设SEQ1,SEQ2和SEQ3是包含后续键值,你懒的序列。

6

我的答案与mtyaka的答案非常相似,但在我看来,它稍微短一些,而且更加模块化。

(map (fn [& vs] (zipmap [:id :name :type] vs)) 
    (id1 id2 id3 ...) 
    (name1 name2 name3 ...) 
    (type1 type2 type3 ...)) 

这里,zipmap期间的“第二步骤”创建使用固定密钥序列和可变值序列,其在“第一步”将是(id1 name1 type1),地图将(id2 name2 type2)

这只有在你的三个懒惰序列彼此隔离时才有效。如果你有懒惰序列,即((id1 id2 ...) (name1 name2 ...) (type1 type2 ...))的序列,那么你将不得不apply上述本SEQ,像这样:

(apply map (fn [& vs] (zipmap [:id :name :type] vs)) 
     ((id1 id2 id3 ...) 
     (name1 name2 name3 ...) 
     (type1 type2 type3 ..))) 

这里,apply简单代码map (fn [& vs] (zipmap [:id :name :type] vs))预先考虑到的序列的前懒序列,并成为一个表达式进行评估。换句话说,它产生与第一代码块完全相同的表达式。