给出键
: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 :(得分: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是包含后续密钥值的惰性序列。