【问题标题】:Multiple lazy sequences into a map将多个惰性序列放入一个映射中
【发布时间】:2012-07-26 20:15:25
【问题描述】:

给定密钥

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

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

【问题讨论】:

  • 所有三个答案都对我有用。感谢 clojure 新手。

标签: clojure


【解决方案1】:

你只需要map:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我会选择:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        • 2013-11-28
        • 2015-01-11
        • 2014-03-31
        • 1970-01-01
        相关资源
        最近更新 更多