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}
...)

我尝试了应用、映射、关联等的各种组合,但没有得到它。

4

3 回答 3

11

你只需要map

(map (fn [id name type] {:id id :name name :type type})
     (id1 id2 id3 ...)
     (name1 name2 name3 ...)
     (type1 type2 type3 ...))
于 2012-07-26T20:36:09.927 回答
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这个序列进行上述操作,如下所示:

(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))到惰性序列序列的前面,这成为要评估的表达式。换句话说,它产生的表达式与第一个代码块完全相同。

于 2012-07-26T23:35:19.817 回答
1

我会去:

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

假设 seq1、seq2 和 seq3 是包含后续键值的惰性序列。

于 2012-07-26T20:41:38.223 回答