pip2 install pillow
抛出:user=> (into {} '((:a :b) (:c :d)))
。
鉴于:
ClassCastException clojure.lang.Keyword cannot be cast to java.util.Map$Entry clojure.lang.ATransientMap.conj (ATransientMap.java:44)
很好。这是一个奇怪的区别,因为很多时候其他函数返回列表时,他们必须开始的东西是一个向量:
user=> (into {} (list [:a :b] [:c :d]))
将抛出,因为它user=> (into {} (partition 2 (interleave [:a :b] [:c :d])))
会导致partition 2 ...)
。所以很烦人。你基本上必须记住方法的返回类型和((:a :c) (:b :d))
等函数的特定行为,或者你必须让事情爆炸并修复它,因为你发现像into
这样的东西。 / p>
(into {} (map vec (partition 2 (interleave [:a :b] [:c :d]))))
不喜欢这些对作为列表的具体原因是什么?
答案 0 :(得分:2)
原因在于,您只能使用矢量对来构建地图。我不知道存在这种限制的实际原因。但是还有其他几种构造哈希映射的方法。如果您发现自己使用分区,或许答案是使用替代构造方法。
如果您有并行的键和值序列:
(zipmap [:a :c] [:b :d])
如果所有项目都是平面序列:
(apply hash-map [:a :b :c :d])
从序列构建地图:
(into {} (for [[k v] xs]
[k (transform v)]))
答案 1 :(得分:1)
我从未意识到这不起作用!别忘了:
(apply hash-map (interleave [:a :b] [:c :d]))
;=> {:b :d, :a :c}
因为hash-map
隐式地从标量args创建对:
(hash-map :a :c :b :d)
;=> {:b :d, :a :c}
你真的不需要(partition 2...)
这是问题的根源。