【问题标题】:Return a map from a list of values in Clojure [duplicate]从 Clojure 中的值列表返回映射 [重复]
【发布时间】:2014-10-08 12:19:36
【问题描述】:

如何将列表或向量中的值放入地图中?

我是这样做的,但看起来并不简单:

user=> (into {} (map #(into [] %) (partition 2 [1 2 3 4 5 6])))
{1 2, 3 4, 5 6}
user=>

或者,如果我还想处理奇数个值(虽然可能不值得,但可能是为了保留键):

user=> (into {} (map #(if (even? (count %))
  #_=>                  (into [] %)
  #_=>                  [(first %) nil])
  #_=>               (partition-all 2 [1 2 3 4 5])))
{1 2, 3 4, 5 nil}
user=>

有没有更简单的方法来做到这一点?

【问题讨论】:

  • 第一个可以用(apply hash-map [1 2 3 4 5 6])完成。
  • 太好了,谢谢@Tomo。我想根据你的建议,我可以用(apply hash-map (let [a [1 2 3 4 5]] (if (odd? (count a)) (conj a nil) a))) 之类的东西来实现第二个。随意把它放在答案格式。
  • 让我们看看有没有比我聪明的人能回答得更好。 :)

标签: clojure


【解决方案1】:

一个对条件过敏的版本,测试向量和列表,偶数和奇数。

(defn seq->map
  [s]
  (let [s+ (concat s [nil])]
    (zipmap (take-nth 2 s+)
            (take-nth 2 (rest s+)))))

(seq->map '(1 2 3 4))   ; {3 4, 1 2}
(seq->map '(1 2 3 4 5)) ; {5 nil, 3 4, 1 2}
(seq->map [1 2 3 4])    ; {3 4, 1 2}
(seq->map [1 2 3 4 5])  ; {5 nil, 3 4, 1 2}

【讨论】:

    【解决方案2】:

    下面的函数应该处理这两种情况(假设一个 Vector 作为参数传递给 to-map):

    (defn to-map [v]
      (apply hash-map
             (if (odd? (count v))
               (conj v nil)
               v)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      相关资源
      最近更新 更多