将多个懒惰序列放入地图中

时间:2012-07-26 20:15:26

标签: clojure

给出键

: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等的各种组合,但没有得到它。

3 个答案:

答案 0 :(得分:11)

您只需要map

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

答案 1 :(得分:6)

我的回答与mtyaka的回答非常相似,但在我看来,它的篇幅更短,更模块化。

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

在这里,zipmap使用固定的键序列和变量值序列创建地图,在“第一步”期间将(id1 name1 type1),在“第二步”期间将{{1}等等。

只有当您的三个懒惰序列彼此隔离时,这才有效。如果你有一系列延迟序列,即(id2 name2 type2),那么你必须((id1 id2 ...) (name1 name2 ...) (type1 type2 ...))上面这个seq,如下所示:

apply

这里,(apply map (fn [& vs] (zipmap [:id :name :type] vs)) ((id1 id2 id3 ...) (name1 name2 name3 ...) (type1 type2 type3 ..))) 只是将代码apply放在延迟序列序列的前面,这就成了要计算的表达式。换句话说,它产生与第一个代码块完全相同的表达式。

答案 2 :(得分:1)

我会选择:

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

假设seq1,seq2和seq3是包含后续密钥值的惰性序列。